<!DOCTYPE html>
<html lang="en-US">
  <head>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width,initial-scale=1">
    <title>3.  Fabric核心模块 | AJ</title>
    <meta name="generator" content="VuePress 1.5.0">
    <link rel="shortcut icon" href="/favicon.ico" type="image/x-icon">
    <script>
            var _hmt = _hmt || [];
            (function() {
            var hm = document.createElement("script");
            hm.src = "https://hm.baidu.com/hm.js?51b8c2e72d1adf96524638ce85bb7d72";
            var s = document.getElementsByTagName("script")[0]; 
            s.parentNode.insertBefore(hm, s);

            // 引入谷歌,不需要可删除这段
            var hm1 = document.createElement("script");
            hm1.src = "https://www.googletagmanager.com/gtag/js?id=G-B7351EYS04";
            var s1 = document.getElementsByTagName("script")[0]; 
            s1.parentNode.insertBefore(hm1, s1);
            })();

            // 谷歌加载,不需要可删除
            window.dataLayer = window.dataLayer || [];
            function gtag(){dataLayer.push(arguments);}
            gtag('js', new Date());

            gtag('config', 'G-B7351EYS04');
        </script>
    <meta name="description" content="阿俊博客|记录一个程序员的成长历程 阿俊博客(blog.zhequtao.com)记录一个后端程序员的成长历程,分享他的学习笔记和心得,还有些开发必备技巧哦! java golang web html dev开发">
    <link rel="preload" href="/assets/css/0.styles.a3df589e.css" as="style"><link rel="preload" href="/assets/js/app.cb35c8f6.js" as="script"><link rel="preload" href="/assets/js/2.063846a6.js" as="script"><link rel="preload" href="/assets/js/4.1ffb4609.js" as="script"><link rel="preload" href="/assets/js/65.2beeae9b.js" as="script"><link rel="prefetch" href="/assets/js/10.5629fe4d.js"><link rel="prefetch" href="/assets/js/100.8417ccea.js"><link rel="prefetch" href="/assets/js/101.37fdb377.js"><link rel="prefetch" href="/assets/js/102.848b686d.js"><link rel="prefetch" href="/assets/js/103.6a2489a0.js"><link rel="prefetch" href="/assets/js/104.99e8899f.js"><link rel="prefetch" href="/assets/js/105.8b741763.js"><link rel="prefetch" href="/assets/js/106.08163715.js"><link rel="prefetch" href="/assets/js/107.21801349.js"><link rel="prefetch" href="/assets/js/108.e3a2892b.js"><link rel="prefetch" href="/assets/js/109.dab5618c.js"><link rel="prefetch" href="/assets/js/11.cddc1623.js"><link rel="prefetch" href="/assets/js/110.f5249b39.js"><link rel="prefetch" href="/assets/js/111.9abf8bce.js"><link rel="prefetch" href="/assets/js/112.8eb86924.js"><link rel="prefetch" href="/assets/js/113.c180ed46.js"><link rel="prefetch" href="/assets/js/114.2370f5b5.js"><link rel="prefetch" href="/assets/js/115.88dc3fd8.js"><link rel="prefetch" href="/assets/js/116.63403600.js"><link rel="prefetch" href="/assets/js/117.83674aa0.js"><link rel="prefetch" href="/assets/js/118.9c58c685.js"><link rel="prefetch" href="/assets/js/119.621f9a70.js"><link rel="prefetch" href="/assets/js/12.ff3d03f5.js"><link rel="prefetch" href="/assets/js/120.a6d2b7f7.js"><link rel="prefetch" href="/assets/js/121.ae0ce9d1.js"><link rel="prefetch" href="/assets/js/122.de240e6d.js"><link rel="prefetch" href="/assets/js/123.b043e3e4.js"><link rel="prefetch" href="/assets/js/124.550af937.js"><link rel="prefetch" href="/assets/js/125.6f06b34c.js"><link rel="prefetch" href="/assets/js/126.38d64604.js"><link rel="prefetch" href="/assets/js/127.a948db56.js"><link rel="prefetch" href="/assets/js/128.4ca789e0.js"><link rel="prefetch" href="/assets/js/129.59be4505.js"><link rel="prefetch" href="/assets/js/13.e9f75cc3.js"><link rel="prefetch" href="/assets/js/130.ddae76a9.js"><link rel="prefetch" href="/assets/js/131.d969c265.js"><link rel="prefetch" href="/assets/js/132.5f43ce5c.js"><link rel="prefetch" href="/assets/js/133.b651af22.js"><link rel="prefetch" href="/assets/js/134.2499236a.js"><link rel="prefetch" href="/assets/js/135.4180596c.js"><link rel="prefetch" href="/assets/js/136.2c309233.js"><link rel="prefetch" href="/assets/js/137.72ca42dd.js"><link rel="prefetch" href="/assets/js/138.3772cd38.js"><link rel="prefetch" href="/assets/js/139.1d0a53da.js"><link rel="prefetch" href="/assets/js/14.be4b89ed.js"><link rel="prefetch" href="/assets/js/140.22368353.js"><link rel="prefetch" href="/assets/js/141.a14aef3c.js"><link rel="prefetch" href="/assets/js/142.2041ce3a.js"><link rel="prefetch" href="/assets/js/143.377262ec.js"><link rel="prefetch" href="/assets/js/144.8fcbc368.js"><link rel="prefetch" href="/assets/js/145.46da36bf.js"><link rel="prefetch" href="/assets/js/146.eceae0d9.js"><link rel="prefetch" href="/assets/js/147.e1bd6531.js"><link rel="prefetch" href="/assets/js/148.76f193ce.js"><link rel="prefetch" href="/assets/js/149.587bd581.js"><link rel="prefetch" href="/assets/js/15.e3219ac0.js"><link rel="prefetch" href="/assets/js/150.169c71e0.js"><link rel="prefetch" href="/assets/js/151.384021ea.js"><link rel="prefetch" href="/assets/js/152.0f20cf03.js"><link rel="prefetch" href="/assets/js/153.fd94af1e.js"><link rel="prefetch" href="/assets/js/154.a550f5dc.js"><link rel="prefetch" href="/assets/js/155.ba1ae86e.js"><link rel="prefetch" href="/assets/js/156.3b98ded0.js"><link rel="prefetch" href="/assets/js/157.cd378596.js"><link rel="prefetch" href="/assets/js/158.c138d0df.js"><link rel="prefetch" href="/assets/js/159.2635f7f4.js"><link rel="prefetch" href="/assets/js/16.c9c35d42.js"><link rel="prefetch" href="/assets/js/160.d51b4126.js"><link rel="prefetch" href="/assets/js/161.5dc29e7b.js"><link rel="prefetch" href="/assets/js/162.f257a92b.js"><link rel="prefetch" href="/assets/js/163.9eb75e40.js"><link rel="prefetch" href="/assets/js/164.8fb1e22b.js"><link rel="prefetch" href="/assets/js/165.49255503.js"><link rel="prefetch" href="/assets/js/166.e54539e6.js"><link rel="prefetch" href="/assets/js/167.a06acdb0.js"><link rel="prefetch" href="/assets/js/168.948ab620.js"><link rel="prefetch" href="/assets/js/169.7d756812.js"><link rel="prefetch" href="/assets/js/17.81067bc8.js"><link rel="prefetch" href="/assets/js/170.ffe63330.js"><link rel="prefetch" href="/assets/js/171.835398b9.js"><link rel="prefetch" href="/assets/js/172.3987be39.js"><link rel="prefetch" href="/assets/js/173.e3cedb8a.js"><link rel="prefetch" href="/assets/js/174.11a32588.js"><link rel="prefetch" href="/assets/js/175.da6f9782.js"><link rel="prefetch" href="/assets/js/176.50e55edc.js"><link rel="prefetch" href="/assets/js/177.a89a1d17.js"><link rel="prefetch" href="/assets/js/178.7ad3ce84.js"><link rel="prefetch" href="/assets/js/179.98a1343b.js"><link rel="prefetch" href="/assets/js/18.b67caf4c.js"><link rel="prefetch" href="/assets/js/180.4e98599b.js"><link rel="prefetch" href="/assets/js/181.dd885afd.js"><link rel="prefetch" href="/assets/js/182.789990c8.js"><link rel="prefetch" href="/assets/js/183.f11ca2fd.js"><link rel="prefetch" href="/assets/js/184.fcf128ec.js"><link rel="prefetch" href="/assets/js/185.54e1e9b6.js"><link rel="prefetch" href="/assets/js/186.db91021a.js"><link rel="prefetch" href="/assets/js/187.5309dd42.js"><link rel="prefetch" href="/assets/js/188.615821ea.js"><link rel="prefetch" href="/assets/js/189.f23f1d42.js"><link rel="prefetch" href="/assets/js/19.294a011c.js"><link rel="prefetch" href="/assets/js/190.efe894bc.js"><link rel="prefetch" href="/assets/js/191.0d14904a.js"><link rel="prefetch" href="/assets/js/192.efd25a9e.js"><link rel="prefetch" href="/assets/js/193.88151f34.js"><link rel="prefetch" href="/assets/js/194.efedce14.js"><link rel="prefetch" href="/assets/js/195.03ac15bb.js"><link rel="prefetch" href="/assets/js/196.fbc18389.js"><link rel="prefetch" href="/assets/js/197.0257ab5e.js"><link rel="prefetch" href="/assets/js/198.f1de2817.js"><link rel="prefetch" href="/assets/js/199.8f1c166b.js"><link rel="prefetch" href="/assets/js/20.1a41edb1.js"><link rel="prefetch" href="/assets/js/200.4af99727.js"><link rel="prefetch" href="/assets/js/201.9f8caef1.js"><link rel="prefetch" href="/assets/js/202.6f07d705.js"><link rel="prefetch" href="/assets/js/203.5012fe50.js"><link rel="prefetch" href="/assets/js/204.3a0dfd8e.js"><link rel="prefetch" href="/assets/js/205.0ba9b606.js"><link rel="prefetch" href="/assets/js/206.663a49ec.js"><link rel="prefetch" href="/assets/js/207.b2406149.js"><link rel="prefetch" href="/assets/js/208.b0b2dfd8.js"><link rel="prefetch" href="/assets/js/209.41a0ec9f.js"><link rel="prefetch" href="/assets/js/21.b6ea6f9a.js"><link rel="prefetch" href="/assets/js/210.6f36beb8.js"><link rel="prefetch" href="/assets/js/211.90ef6e5c.js"><link rel="prefetch" href="/assets/js/212.42339063.js"><link rel="prefetch" href="/assets/js/213.a2bfeda9.js"><link rel="prefetch" href="/assets/js/214.5c7eb42a.js"><link rel="prefetch" href="/assets/js/215.18260ae5.js"><link rel="prefetch" href="/assets/js/216.7678fd29.js"><link rel="prefetch" href="/assets/js/217.9d936f88.js"><link rel="prefetch" href="/assets/js/218.bac403c4.js"><link rel="prefetch" href="/assets/js/219.9d8cb16b.js"><link rel="prefetch" href="/assets/js/22.367cc253.js"><link rel="prefetch" href="/assets/js/220.375b7707.js"><link rel="prefetch" href="/assets/js/221.3e400da4.js"><link rel="prefetch" href="/assets/js/222.8fbd2857.js"><link rel="prefetch" href="/assets/js/223.76a10075.js"><link rel="prefetch" href="/assets/js/224.ff94cc4e.js"><link rel="prefetch" href="/assets/js/225.d4688ca6.js"><link rel="prefetch" href="/assets/js/226.b13b18af.js"><link rel="prefetch" href="/assets/js/227.288d0f96.js"><link rel="prefetch" href="/assets/js/228.60430ac0.js"><link rel="prefetch" href="/assets/js/229.da728342.js"><link rel="prefetch" href="/assets/js/23.bc3de730.js"><link rel="prefetch" href="/assets/js/230.d8417d20.js"><link rel="prefetch" href="/assets/js/231.6a9ce0b4.js"><link rel="prefetch" href="/assets/js/232.7611b413.js"><link rel="prefetch" href="/assets/js/233.94712cf9.js"><link rel="prefetch" href="/assets/js/234.93888298.js"><link rel="prefetch" href="/assets/js/235.62506981.js"><link rel="prefetch" href="/assets/js/236.5a055c7c.js"><link rel="prefetch" href="/assets/js/237.0a6c4902.js"><link rel="prefetch" href="/assets/js/238.e5f37663.js"><link rel="prefetch" href="/assets/js/239.331bba86.js"><link rel="prefetch" href="/assets/js/24.82f0901c.js"><link rel="prefetch" href="/assets/js/240.59591cfc.js"><link rel="prefetch" href="/assets/js/241.ce671f47.js"><link rel="prefetch" href="/assets/js/242.fb2542fa.js"><link rel="prefetch" href="/assets/js/243.74abc73d.js"><link rel="prefetch" href="/assets/js/244.ecd707b2.js"><link rel="prefetch" href="/assets/js/245.d728367b.js"><link rel="prefetch" href="/assets/js/246.9270e7fe.js"><link rel="prefetch" href="/assets/js/247.a421ba15.js"><link rel="prefetch" href="/assets/js/248.e759132e.js"><link rel="prefetch" href="/assets/js/249.3077fb46.js"><link rel="prefetch" href="/assets/js/25.95c551dc.js"><link rel="prefetch" href="/assets/js/250.5fe4dd03.js"><link rel="prefetch" href="/assets/js/251.4b8fe76c.js"><link rel="prefetch" href="/assets/js/252.0d1cf7ea.js"><link rel="prefetch" href="/assets/js/253.89d16ba0.js"><link rel="prefetch" href="/assets/js/254.8d1afc68.js"><link rel="prefetch" href="/assets/js/255.64e680cb.js"><link rel="prefetch" href="/assets/js/256.9defbd0e.js"><link rel="prefetch" href="/assets/js/257.1fef24fd.js"><link rel="prefetch" href="/assets/js/258.4e205286.js"><link rel="prefetch" href="/assets/js/259.f3d56efc.js"><link rel="prefetch" href="/assets/js/26.7fe56bac.js"><link rel="prefetch" href="/assets/js/260.378299e6.js"><link rel="prefetch" href="/assets/js/261.8e4fb397.js"><link rel="prefetch" href="/assets/js/262.54595d98.js"><link rel="prefetch" href="/assets/js/263.fb333dc1.js"><link rel="prefetch" href="/assets/js/264.13d13301.js"><link rel="prefetch" href="/assets/js/265.c85104bc.js"><link rel="prefetch" href="/assets/js/266.9f3d1f1c.js"><link rel="prefetch" href="/assets/js/267.fb392815.js"><link rel="prefetch" href="/assets/js/268.add7eacb.js"><link rel="prefetch" href="/assets/js/269.7e49fcc7.js"><link rel="prefetch" href="/assets/js/27.5547e5f0.js"><link rel="prefetch" href="/assets/js/270.22342070.js"><link rel="prefetch" href="/assets/js/271.59917b1a.js"><link rel="prefetch" href="/assets/js/272.4a4751d5.js"><link rel="prefetch" href="/assets/js/273.f4c2fa5c.js"><link rel="prefetch" href="/assets/js/274.1208bc94.js"><link rel="prefetch" href="/assets/js/275.f6528753.js"><link rel="prefetch" href="/assets/js/276.a68772cd.js"><link rel="prefetch" href="/assets/js/277.f154ab32.js"><link rel="prefetch" href="/assets/js/278.bb616a63.js"><link rel="prefetch" href="/assets/js/279.6a356cff.js"><link rel="prefetch" href="/assets/js/28.b08b2847.js"><link rel="prefetch" href="/assets/js/280.5afc20fc.js"><link rel="prefetch" href="/assets/js/281.3cd86225.js"><link rel="prefetch" href="/assets/js/282.3ecb92aa.js"><link rel="prefetch" href="/assets/js/283.85159ea7.js"><link rel="prefetch" href="/assets/js/284.b6545c68.js"><link rel="prefetch" href="/assets/js/285.5e83ee29.js"><link rel="prefetch" href="/assets/js/286.2aad298d.js"><link rel="prefetch" href="/assets/js/287.3ca76244.js"><link rel="prefetch" href="/assets/js/288.5b17963d.js"><link rel="prefetch" href="/assets/js/289.f47a759b.js"><link rel="prefetch" href="/assets/js/29.562dbf7d.js"><link rel="prefetch" href="/assets/js/290.36b603c7.js"><link rel="prefetch" href="/assets/js/291.a9bd8951.js"><link rel="prefetch" href="/assets/js/292.dfc54f28.js"><link rel="prefetch" href="/assets/js/293.2d061212.js"><link rel="prefetch" href="/assets/js/294.6d564a9e.js"><link rel="prefetch" href="/assets/js/295.a31dd593.js"><link rel="prefetch" href="/assets/js/296.3101e5e8.js"><link rel="prefetch" href="/assets/js/297.7efde936.js"><link rel="prefetch" href="/assets/js/298.8bb3aa68.js"><link rel="prefetch" href="/assets/js/299.8b51e6bd.js"><link rel="prefetch" href="/assets/js/3.76257eb7.js"><link rel="prefetch" href="/assets/js/30.221adea2.js"><link rel="prefetch" href="/assets/js/300.62effe45.js"><link rel="prefetch" href="/assets/js/301.98c863c5.js"><link rel="prefetch" href="/assets/js/302.e3493ab2.js"><link rel="prefetch" href="/assets/js/303.800c8028.js"><link rel="prefetch" href="/assets/js/304.b6f08986.js"><link rel="prefetch" href="/assets/js/305.09af356b.js"><link rel="prefetch" href="/assets/js/306.d0d3589d.js"><link rel="prefetch" href="/assets/js/307.ee2fd249.js"><link rel="prefetch" href="/assets/js/308.f3f76368.js"><link rel="prefetch" href="/assets/js/309.d2b5ce40.js"><link rel="prefetch" href="/assets/js/31.334fc8bb.js"><link rel="prefetch" href="/assets/js/310.b4fa2feb.js"><link rel="prefetch" href="/assets/js/311.7d747ef3.js"><link rel="prefetch" href="/assets/js/312.89bdff40.js"><link rel="prefetch" href="/assets/js/313.875b82fe.js"><link rel="prefetch" href="/assets/js/314.0bbe51c4.js"><link rel="prefetch" href="/assets/js/315.cc07dbcf.js"><link rel="prefetch" href="/assets/js/316.bc72b152.js"><link rel="prefetch" href="/assets/js/317.55462812.js"><link rel="prefetch" href="/assets/js/318.a158fda0.js"><link rel="prefetch" href="/assets/js/319.b03a5bd2.js"><link rel="prefetch" href="/assets/js/32.d6826b16.js"><link rel="prefetch" href="/assets/js/320.a5bd19b0.js"><link rel="prefetch" href="/assets/js/321.4f9faaa7.js"><link rel="prefetch" href="/assets/js/322.dbd3b4fa.js"><link rel="prefetch" href="/assets/js/323.a04e2062.js"><link rel="prefetch" href="/assets/js/324.c45b46cf.js"><link rel="prefetch" href="/assets/js/325.cd1460c4.js"><link rel="prefetch" href="/assets/js/326.bd90ef85.js"><link rel="prefetch" href="/assets/js/327.8bf38ef7.js"><link rel="prefetch" href="/assets/js/328.99e9aed3.js"><link rel="prefetch" href="/assets/js/329.de0012cb.js"><link rel="prefetch" href="/assets/js/33.b1059062.js"><link rel="prefetch" href="/assets/js/330.59f11391.js"><link rel="prefetch" href="/assets/js/331.6d16a13c.js"><link rel="prefetch" href="/assets/js/332.922ca235.js"><link rel="prefetch" href="/assets/js/333.c94c3602.js"><link rel="prefetch" href="/assets/js/334.77e02010.js"><link rel="prefetch" href="/assets/js/335.1e0c4f7b.js"><link rel="prefetch" href="/assets/js/336.5675dc4f.js"><link rel="prefetch" href="/assets/js/337.bb6e11dc.js"><link rel="prefetch" href="/assets/js/338.294981e9.js"><link rel="prefetch" href="/assets/js/339.d0376372.js"><link rel="prefetch" href="/assets/js/34.0c7d5782.js"><link rel="prefetch" href="/assets/js/340.64596428.js"><link rel="prefetch" href="/assets/js/341.ec0f9409.js"><link rel="prefetch" href="/assets/js/342.7abc47c4.js"><link rel="prefetch" href="/assets/js/343.4262d486.js"><link rel="prefetch" href="/assets/js/344.8729ad8c.js"><link rel="prefetch" href="/assets/js/345.c210d888.js"><link rel="prefetch" href="/assets/js/346.6f42f7cb.js"><link rel="prefetch" href="/assets/js/347.81b41ae5.js"><link rel="prefetch" href="/assets/js/348.07eca37c.js"><link rel="prefetch" href="/assets/js/349.8019d6f3.js"><link rel="prefetch" href="/assets/js/35.ae14e37f.js"><link rel="prefetch" href="/assets/js/350.57da2e7b.js"><link rel="prefetch" href="/assets/js/351.2e99afdf.js"><link rel="prefetch" href="/assets/js/352.67dd88b7.js"><link rel="prefetch" href="/assets/js/353.15b9f624.js"><link rel="prefetch" href="/assets/js/354.a63e8432.js"><link rel="prefetch" href="/assets/js/355.bbc16ee9.js"><link rel="prefetch" href="/assets/js/356.ff63d3bb.js"><link rel="prefetch" href="/assets/js/357.4fb2d941.js"><link rel="prefetch" href="/assets/js/358.55182977.js"><link rel="prefetch" href="/assets/js/359.265c3d26.js"><link rel="prefetch" href="/assets/js/36.b9ed4cf1.js"><link rel="prefetch" href="/assets/js/360.ced80eb3.js"><link rel="prefetch" href="/assets/js/361.afe6ba84.js"><link rel="prefetch" href="/assets/js/362.c2b62518.js"><link rel="prefetch" href="/assets/js/363.0c4a4800.js"><link rel="prefetch" href="/assets/js/364.ce60291b.js"><link rel="prefetch" href="/assets/js/365.0e3a61f9.js"><link rel="prefetch" href="/assets/js/366.d53ccb03.js"><link rel="prefetch" href="/assets/js/367.689e464d.js"><link rel="prefetch" href="/assets/js/368.418c571f.js"><link rel="prefetch" href="/assets/js/369.c2fff3c8.js"><link rel="prefetch" href="/assets/js/37.a021ac57.js"><link rel="prefetch" href="/assets/js/370.a932b958.js"><link rel="prefetch" href="/assets/js/371.7d153241.js"><link rel="prefetch" href="/assets/js/372.fb9878fa.js"><link rel="prefetch" href="/assets/js/373.85772e03.js"><link rel="prefetch" href="/assets/js/374.b4a8b1b6.js"><link rel="prefetch" href="/assets/js/375.32f70596.js"><link rel="prefetch" href="/assets/js/376.a16d79a8.js"><link rel="prefetch" href="/assets/js/377.c996b7e1.js"><link rel="prefetch" href="/assets/js/378.d37d15c7.js"><link rel="prefetch" href="/assets/js/379.b81ba7dd.js"><link rel="prefetch" href="/assets/js/38.89138658.js"><link rel="prefetch" href="/assets/js/380.524c9b31.js"><link rel="prefetch" href="/assets/js/381.7ebfd6db.js"><link rel="prefetch" href="/assets/js/382.29edda0f.js"><link rel="prefetch" href="/assets/js/383.9642a212.js"><link rel="prefetch" href="/assets/js/384.086e3b42.js"><link rel="prefetch" href="/assets/js/385.a9bb46a8.js"><link rel="prefetch" href="/assets/js/386.f2561a39.js"><link rel="prefetch" href="/assets/js/387.ba9b6aaa.js"><link rel="prefetch" href="/assets/js/388.e0ace495.js"><link rel="prefetch" href="/assets/js/389.ba8c09dd.js"><link rel="prefetch" href="/assets/js/39.04f331e3.js"><link rel="prefetch" href="/assets/js/390.de1bb48b.js"><link rel="prefetch" href="/assets/js/391.7cc6edeb.js"><link rel="prefetch" href="/assets/js/392.0493a6f7.js"><link rel="prefetch" href="/assets/js/393.ba2d3e62.js"><link rel="prefetch" href="/assets/js/394.b3aa9224.js"><link rel="prefetch" href="/assets/js/395.f4df3a60.js"><link rel="prefetch" href="/assets/js/396.09644790.js"><link rel="prefetch" href="/assets/js/397.76163964.js"><link rel="prefetch" href="/assets/js/398.377fd8fc.js"><link rel="prefetch" href="/assets/js/399.39059be5.js"><link rel="prefetch" href="/assets/js/40.a21abf05.js"><link rel="prefetch" href="/assets/js/400.559a547f.js"><link rel="prefetch" href="/assets/js/401.bc6d738c.js"><link rel="prefetch" href="/assets/js/402.c504ed7b.js"><link rel="prefetch" href="/assets/js/403.77a0af9c.js"><link rel="prefetch" href="/assets/js/404.0f408cc6.js"><link rel="prefetch" href="/assets/js/405.90b0bab6.js"><link rel="prefetch" href="/assets/js/406.01b11432.js"><link rel="prefetch" href="/assets/js/407.58991ce5.js"><link rel="prefetch" href="/assets/js/408.9806278e.js"><link rel="prefetch" href="/assets/js/409.8d9b4bb3.js"><link rel="prefetch" href="/assets/js/41.6bcfc592.js"><link rel="prefetch" href="/assets/js/410.02dee620.js"><link rel="prefetch" href="/assets/js/411.3d12d3a6.js"><link rel="prefetch" href="/assets/js/412.37a62624.js"><link rel="prefetch" href="/assets/js/413.bda7ca34.js"><link rel="prefetch" href="/assets/js/414.2abb6547.js"><link rel="prefetch" href="/assets/js/415.1d271923.js"><link rel="prefetch" href="/assets/js/416.d1b11dfe.js"><link rel="prefetch" href="/assets/js/417.fcbf07ff.js"><link rel="prefetch" href="/assets/js/418.524d40ba.js"><link rel="prefetch" href="/assets/js/419.f264e463.js"><link rel="prefetch" href="/assets/js/42.ec85a270.js"><link rel="prefetch" href="/assets/js/420.8b99e60d.js"><link rel="prefetch" href="/assets/js/421.c697d876.js"><link rel="prefetch" href="/assets/js/422.4af54ae0.js"><link rel="prefetch" href="/assets/js/423.b75f24ff.js"><link rel="prefetch" href="/assets/js/424.ea80054f.js"><link rel="prefetch" href="/assets/js/425.804b48b0.js"><link rel="prefetch" href="/assets/js/426.ffed8383.js"><link rel="prefetch" href="/assets/js/427.2040bd22.js"><link rel="prefetch" href="/assets/js/428.b878fb56.js"><link rel="prefetch" href="/assets/js/429.f81fd922.js"><link rel="prefetch" href="/assets/js/43.c174449d.js"><link rel="prefetch" href="/assets/js/430.16f328ab.js"><link rel="prefetch" href="/assets/js/431.56f11924.js"><link rel="prefetch" href="/assets/js/432.e4c77710.js"><link rel="prefetch" href="/assets/js/433.29acf14b.js"><link rel="prefetch" href="/assets/js/434.33ee22fc.js"><link rel="prefetch" href="/assets/js/435.516f7600.js"><link rel="prefetch" href="/assets/js/436.28ae526a.js"><link rel="prefetch" href="/assets/js/437.b9bac473.js"><link rel="prefetch" href="/assets/js/438.711bd934.js"><link rel="prefetch" href="/assets/js/439.fe5f28bd.js"><link rel="prefetch" href="/assets/js/44.8704338b.js"><link rel="prefetch" href="/assets/js/440.b2f48747.js"><link rel="prefetch" href="/assets/js/441.4862a724.js"><link rel="prefetch" href="/assets/js/442.751f8ae7.js"><link rel="prefetch" href="/assets/js/443.9998dbe9.js"><link rel="prefetch" href="/assets/js/444.23d3f688.js"><link rel="prefetch" href="/assets/js/445.72419f35.js"><link rel="prefetch" href="/assets/js/446.21e02b7b.js"><link rel="prefetch" href="/assets/js/447.6bd039e5.js"><link rel="prefetch" href="/assets/js/448.af29ff31.js"><link rel="prefetch" href="/assets/js/449.bbdca196.js"><link rel="prefetch" href="/assets/js/45.f8a2a3b3.js"><link rel="prefetch" href="/assets/js/450.32e470b8.js"><link rel="prefetch" href="/assets/js/451.f4c8ff6a.js"><link rel="prefetch" href="/assets/js/452.c0ec8943.js"><link rel="prefetch" href="/assets/js/453.5af475c6.js"><link rel="prefetch" href="/assets/js/454.567aa6c1.js"><link rel="prefetch" href="/assets/js/455.326072d1.js"><link rel="prefetch" href="/assets/js/456.64b88847.js"><link rel="prefetch" href="/assets/js/457.61c91559.js"><link rel="prefetch" href="/assets/js/458.4f4d43d6.js"><link rel="prefetch" href="/assets/js/459.a88891cb.js"><link rel="prefetch" href="/assets/js/46.90855a0f.js"><link rel="prefetch" href="/assets/js/460.fb9e15f6.js"><link rel="prefetch" href="/assets/js/461.998a4991.js"><link rel="prefetch" href="/assets/js/462.56ecfb03.js"><link rel="prefetch" href="/assets/js/463.582cd053.js"><link rel="prefetch" href="/assets/js/464.f12a0050.js"><link rel="prefetch" href="/assets/js/465.cc3b08a8.js"><link rel="prefetch" href="/assets/js/466.ea7e4ce2.js"><link rel="prefetch" href="/assets/js/467.58700d93.js"><link rel="prefetch" href="/assets/js/468.bb9998cd.js"><link rel="prefetch" href="/assets/js/469.232d261d.js"><link rel="prefetch" href="/assets/js/47.02516d33.js"><link rel="prefetch" href="/assets/js/470.90ab2be8.js"><link rel="prefetch" href="/assets/js/471.3652fec6.js"><link rel="prefetch" href="/assets/js/472.bc7517c9.js"><link rel="prefetch" href="/assets/js/473.27b7892f.js"><link rel="prefetch" href="/assets/js/474.0d488768.js"><link rel="prefetch" href="/assets/js/475.bc33cf17.js"><link rel="prefetch" href="/assets/js/476.76ce67eb.js"><link rel="prefetch" href="/assets/js/477.a20657f6.js"><link rel="prefetch" href="/assets/js/478.8905ef26.js"><link rel="prefetch" href="/assets/js/479.23ec3dc9.js"><link rel="prefetch" href="/assets/js/48.8d38983c.js"><link rel="prefetch" href="/assets/js/480.105bf58e.js"><link rel="prefetch" href="/assets/js/481.d62a3699.js"><link rel="prefetch" href="/assets/js/482.6cb10cdb.js"><link rel="prefetch" href="/assets/js/483.15b9ef53.js"><link rel="prefetch" href="/assets/js/484.794aff9c.js"><link rel="prefetch" href="/assets/js/485.3e6ef3cb.js"><link rel="prefetch" href="/assets/js/486.fc20eb22.js"><link rel="prefetch" href="/assets/js/487.2a4f7d47.js"><link rel="prefetch" href="/assets/js/488.24ba9af5.js"><link rel="prefetch" href="/assets/js/489.d451928e.js"><link rel="prefetch" href="/assets/js/49.bd70c59c.js"><link rel="prefetch" href="/assets/js/490.d83e4fc7.js"><link rel="prefetch" href="/assets/js/491.0210a738.js"><link rel="prefetch" href="/assets/js/492.3a69cd85.js"><link rel="prefetch" href="/assets/js/493.89d2920f.js"><link rel="prefetch" href="/assets/js/494.b7d1c15e.js"><link rel="prefetch" href="/assets/js/495.7ccfe17f.js"><link rel="prefetch" href="/assets/js/496.0d6c912a.js"><link rel="prefetch" href="/assets/js/497.087ca2c6.js"><link rel="prefetch" href="/assets/js/498.f2b3c894.js"><link rel="prefetch" href="/assets/js/499.e741f312.js"><link rel="prefetch" href="/assets/js/5.405f2620.js"><link rel="prefetch" href="/assets/js/50.9df07553.js"><link rel="prefetch" href="/assets/js/500.cb9babb9.js"><link rel="prefetch" href="/assets/js/501.63a859b6.js"><link rel="prefetch" href="/assets/js/502.f346b273.js"><link rel="prefetch" href="/assets/js/503.cdcd3de3.js"><link rel="prefetch" href="/assets/js/504.e83ec450.js"><link rel="prefetch" href="/assets/js/505.95f18293.js"><link rel="prefetch" href="/assets/js/506.02060a3c.js"><link rel="prefetch" href="/assets/js/507.859d6ae4.js"><link rel="prefetch" href="/assets/js/508.9724d886.js"><link rel="prefetch" href="/assets/js/509.e17dd53e.js"><link rel="prefetch" href="/assets/js/51.3dfc6350.js"><link rel="prefetch" href="/assets/js/510.ea0c942f.js"><link rel="prefetch" href="/assets/js/511.64a7f9a8.js"><link rel="prefetch" href="/assets/js/512.6cce418a.js"><link rel="prefetch" href="/assets/js/513.ea813fe8.js"><link rel="prefetch" href="/assets/js/514.10242470.js"><link rel="prefetch" href="/assets/js/515.5308bdf6.js"><link rel="prefetch" href="/assets/js/516.dfb113bc.js"><link rel="prefetch" href="/assets/js/517.96c71069.js"><link rel="prefetch" href="/assets/js/518.5594480e.js"><link rel="prefetch" href="/assets/js/519.91e848ae.js"><link rel="prefetch" href="/assets/js/52.dd230cd7.js"><link rel="prefetch" href="/assets/js/520.ebe69ce9.js"><link rel="prefetch" href="/assets/js/521.92b80342.js"><link rel="prefetch" href="/assets/js/522.6ce581ea.js"><link rel="prefetch" href="/assets/js/523.40b7f2f9.js"><link rel="prefetch" href="/assets/js/524.4ef256d3.js"><link rel="prefetch" href="/assets/js/525.19741e4a.js"><link rel="prefetch" href="/assets/js/526.e5de1675.js"><link rel="prefetch" href="/assets/js/527.9a79cd42.js"><link rel="prefetch" href="/assets/js/528.72732eb8.js"><link rel="prefetch" href="/assets/js/529.2ea03e45.js"><link rel="prefetch" href="/assets/js/53.a349c565.js"><link rel="prefetch" href="/assets/js/530.5d1103e7.js"><link rel="prefetch" href="/assets/js/531.82b032d6.js"><link rel="prefetch" href="/assets/js/532.12ee4beb.js"><link rel="prefetch" href="/assets/js/533.db9a90f7.js"><link rel="prefetch" href="/assets/js/534.fe139db4.js"><link rel="prefetch" href="/assets/js/535.056a6fbb.js"><link rel="prefetch" href="/assets/js/536.6bf85c15.js"><link rel="prefetch" href="/assets/js/537.6e2e1ccf.js"><link rel="prefetch" href="/assets/js/538.54eddb3b.js"><link rel="prefetch" href="/assets/js/539.6f00a207.js"><link rel="prefetch" href="/assets/js/54.e292b52f.js"><link rel="prefetch" href="/assets/js/540.9c956205.js"><link rel="prefetch" href="/assets/js/541.50f41228.js"><link rel="prefetch" href="/assets/js/542.a2b1879e.js"><link rel="prefetch" href="/assets/js/543.4e5e17c9.js"><link rel="prefetch" href="/assets/js/544.63d85227.js"><link rel="prefetch" href="/assets/js/545.c3923644.js"><link rel="prefetch" href="/assets/js/546.e64ad073.js"><link rel="prefetch" href="/assets/js/547.35a8752d.js"><link rel="prefetch" href="/assets/js/548.b62a1348.js"><link rel="prefetch" href="/assets/js/549.369e2ea0.js"><link rel="prefetch" href="/assets/js/55.21bb2983.js"><link rel="prefetch" href="/assets/js/550.b4632248.js"><link rel="prefetch" href="/assets/js/551.18f1879c.js"><link rel="prefetch" href="/assets/js/552.162e63cd.js"><link rel="prefetch" href="/assets/js/553.6998130e.js"><link rel="prefetch" href="/assets/js/554.89126c3d.js"><link rel="prefetch" href="/assets/js/555.a5f63b8a.js"><link rel="prefetch" href="/assets/js/556.35381cef.js"><link rel="prefetch" href="/assets/js/557.ceeecf52.js"><link rel="prefetch" href="/assets/js/558.253e6e4f.js"><link rel="prefetch" href="/assets/js/559.5cfbb773.js"><link rel="prefetch" href="/assets/js/56.5382d6b4.js"><link rel="prefetch" href="/assets/js/560.cca52f22.js"><link rel="prefetch" href="/assets/js/561.ea8d1141.js"><link rel="prefetch" href="/assets/js/562.c32e7b96.js"><link rel="prefetch" href="/assets/js/563.9bdd42e7.js"><link rel="prefetch" href="/assets/js/564.b3b87ec0.js"><link rel="prefetch" href="/assets/js/565.4be0d0f7.js"><link rel="prefetch" href="/assets/js/566.9f379d12.js"><link rel="prefetch" href="/assets/js/567.261e3181.js"><link rel="prefetch" href="/assets/js/568.4229e365.js"><link rel="prefetch" href="/assets/js/569.e662c167.js"><link rel="prefetch" href="/assets/js/57.8129f7e0.js"><link rel="prefetch" href="/assets/js/570.97ff6423.js"><link rel="prefetch" href="/assets/js/571.de1377cd.js"><link rel="prefetch" href="/assets/js/572.48b8400b.js"><link rel="prefetch" href="/assets/js/573.8251ebaf.js"><link rel="prefetch" href="/assets/js/574.ec3d6c1e.js"><link rel="prefetch" href="/assets/js/575.b0d429a1.js"><link rel="prefetch" href="/assets/js/576.98ce9170.js"><link rel="prefetch" href="/assets/js/577.85fc2017.js"><link rel="prefetch" href="/assets/js/578.1393ac7f.js"><link rel="prefetch" href="/assets/js/579.1340e178.js"><link rel="prefetch" href="/assets/js/58.85ac2740.js"><link rel="prefetch" href="/assets/js/580.a5979445.js"><link rel="prefetch" href="/assets/js/581.effdc269.js"><link rel="prefetch" href="/assets/js/582.13276063.js"><link rel="prefetch" href="/assets/js/583.357a2443.js"><link rel="prefetch" href="/assets/js/584.338ef731.js"><link rel="prefetch" href="/assets/js/585.87932741.js"><link rel="prefetch" href="/assets/js/586.b1d6e000.js"><link rel="prefetch" href="/assets/js/587.ed5b8377.js"><link rel="prefetch" href="/assets/js/588.16d2c418.js"><link rel="prefetch" href="/assets/js/589.c96fd7fa.js"><link rel="prefetch" href="/assets/js/59.0b225757.js"><link rel="prefetch" href="/assets/js/590.1a06b2a0.js"><link rel="prefetch" href="/assets/js/591.0efd886c.js"><link rel="prefetch" href="/assets/js/592.b22d0ef5.js"><link rel="prefetch" href="/assets/js/593.84ed6ebe.js"><link rel="prefetch" href="/assets/js/594.cd721b88.js"><link rel="prefetch" href="/assets/js/595.2400817a.js"><link rel="prefetch" href="/assets/js/596.f2c512d1.js"><link rel="prefetch" href="/assets/js/597.df10ec57.js"><link rel="prefetch" href="/assets/js/598.61ef6a7d.js"><link rel="prefetch" href="/assets/js/599.0bebb562.js"><link rel="prefetch" href="/assets/js/6.29d112b1.js"><link rel="prefetch" href="/assets/js/60.3bbab51d.js"><link rel="prefetch" href="/assets/js/600.1ea7596f.js"><link rel="prefetch" href="/assets/js/601.f2642bb3.js"><link rel="prefetch" href="/assets/js/602.400cc987.js"><link rel="prefetch" href="/assets/js/603.db77d173.js"><link rel="prefetch" href="/assets/js/604.0ffa30ae.js"><link rel="prefetch" href="/assets/js/605.32ca9607.js"><link rel="prefetch" href="/assets/js/606.8c1e5683.js"><link rel="prefetch" href="/assets/js/607.9c9463ef.js"><link rel="prefetch" href="/assets/js/608.d5efa77e.js"><link rel="prefetch" href="/assets/js/609.5bbffb7d.js"><link rel="prefetch" href="/assets/js/61.f7301486.js"><link rel="prefetch" href="/assets/js/610.5b0fc9da.js"><link rel="prefetch" href="/assets/js/611.bb8058c9.js"><link rel="prefetch" href="/assets/js/612.b0788f43.js"><link rel="prefetch" href="/assets/js/613.49511e65.js"><link rel="prefetch" href="/assets/js/614.fae3eacf.js"><link rel="prefetch" href="/assets/js/615.359e5899.js"><link rel="prefetch" href="/assets/js/616.905132f4.js"><link rel="prefetch" href="/assets/js/617.6c8c594e.js"><link rel="prefetch" href="/assets/js/618.6ac4f3ff.js"><link rel="prefetch" href="/assets/js/619.411a0c14.js"><link rel="prefetch" href="/assets/js/62.9aeede84.js"><link rel="prefetch" href="/assets/js/620.56155724.js"><link rel="prefetch" href="/assets/js/621.149d7933.js"><link rel="prefetch" href="/assets/js/622.f0c9bc08.js"><link rel="prefetch" href="/assets/js/623.e0989fbe.js"><link rel="prefetch" href="/assets/js/624.80b1f6a9.js"><link rel="prefetch" href="/assets/js/625.a0a392c4.js"><link rel="prefetch" href="/assets/js/626.56fd4e8a.js"><link rel="prefetch" href="/assets/js/627.264e7313.js"><link rel="prefetch" href="/assets/js/628.7a868b19.js"><link rel="prefetch" href="/assets/js/629.e7e15da1.js"><link rel="prefetch" href="/assets/js/63.4df55c8b.js"><link rel="prefetch" href="/assets/js/630.998c9b61.js"><link rel="prefetch" href="/assets/js/631.69aa049c.js"><link rel="prefetch" href="/assets/js/632.da3882c1.js"><link rel="prefetch" href="/assets/js/633.0d49adf0.js"><link rel="prefetch" href="/assets/js/634.f9984ede.js"><link rel="prefetch" href="/assets/js/635.f0439f65.js"><link rel="prefetch" href="/assets/js/636.54de4194.js"><link rel="prefetch" href="/assets/js/637.55d1c226.js"><link rel="prefetch" href="/assets/js/638.2a9a510f.js"><link rel="prefetch" href="/assets/js/639.8bec360e.js"><link rel="prefetch" href="/assets/js/64.7f3e5e81.js"><link rel="prefetch" href="/assets/js/640.30d7f96e.js"><link rel="prefetch" href="/assets/js/641.68100098.js"><link rel="prefetch" href="/assets/js/642.4b793817.js"><link rel="prefetch" href="/assets/js/643.d86a81ea.js"><link rel="prefetch" href="/assets/js/644.76327ea2.js"><link rel="prefetch" href="/assets/js/645.0ac6a923.js"><link rel="prefetch" href="/assets/js/646.cd92f728.js"><link rel="prefetch" href="/assets/js/647.f2c624e1.js"><link rel="prefetch" href="/assets/js/648.c8f3b955.js"><link rel="prefetch" href="/assets/js/649.6370753b.js"><link rel="prefetch" href="/assets/js/650.afe31909.js"><link rel="prefetch" href="/assets/js/651.87971ec0.js"><link rel="prefetch" href="/assets/js/652.0adf10a6.js"><link rel="prefetch" href="/assets/js/653.1f655726.js"><link rel="prefetch" href="/assets/js/654.53e24c7c.js"><link rel="prefetch" href="/assets/js/655.c95a66ea.js"><link rel="prefetch" href="/assets/js/656.38b5a5ea.js"><link rel="prefetch" href="/assets/js/657.3167aa94.js"><link rel="prefetch" href="/assets/js/658.7c40ff62.js"><link rel="prefetch" href="/assets/js/659.5d2b9b54.js"><link rel="prefetch" href="/assets/js/66.44b214db.js"><link rel="prefetch" href="/assets/js/660.96a8da9e.js"><link rel="prefetch" href="/assets/js/661.4de3b6c1.js"><link rel="prefetch" href="/assets/js/662.7d9bf181.js"><link rel="prefetch" href="/assets/js/663.4ccaf40a.js"><link rel="prefetch" href="/assets/js/664.7ab4fa53.js"><link rel="prefetch" href="/assets/js/665.32245d26.js"><link rel="prefetch" href="/assets/js/666.e6617151.js"><link rel="prefetch" href="/assets/js/667.fb3b0547.js"><link rel="prefetch" href="/assets/js/668.3d1b2e36.js"><link rel="prefetch" href="/assets/js/669.b769905f.js"><link rel="prefetch" href="/assets/js/67.c31aaacf.js"><link rel="prefetch" href="/assets/js/670.88ed3af3.js"><link rel="prefetch" href="/assets/js/671.1aff6bfe.js"><link rel="prefetch" href="/assets/js/672.c90888f7.js"><link rel="prefetch" href="/assets/js/673.81241fdc.js"><link rel="prefetch" href="/assets/js/674.838a424d.js"><link rel="prefetch" href="/assets/js/675.603ac896.js"><link rel="prefetch" href="/assets/js/676.ff44b5dc.js"><link rel="prefetch" href="/assets/js/677.41a8087a.js"><link rel="prefetch" href="/assets/js/678.f0eb8d04.js"><link rel="prefetch" href="/assets/js/679.db78199e.js"><link rel="prefetch" href="/assets/js/68.08607c89.js"><link rel="prefetch" href="/assets/js/680.8fded9d4.js"><link rel="prefetch" href="/assets/js/681.0b019dfd.js"><link rel="prefetch" href="/assets/js/682.746e9190.js"><link rel="prefetch" href="/assets/js/683.d5c00845.js"><link rel="prefetch" href="/assets/js/684.b3207cad.js"><link rel="prefetch" href="/assets/js/685.d78f18ba.js"><link rel="prefetch" href="/assets/js/686.5aaecd19.js"><link rel="prefetch" href="/assets/js/687.821a06f4.js"><link rel="prefetch" href="/assets/js/688.8bbc1890.js"><link rel="prefetch" href="/assets/js/689.79b49e8c.js"><link rel="prefetch" href="/assets/js/69.509245d6.js"><link rel="prefetch" href="/assets/js/690.fa62f9dd.js"><link rel="prefetch" href="/assets/js/691.d3eb1a60.js"><link rel="prefetch" href="/assets/js/692.738f14bb.js"><link rel="prefetch" href="/assets/js/693.e6a497a2.js"><link rel="prefetch" href="/assets/js/694.6eea1c54.js"><link rel="prefetch" href="/assets/js/695.88e6acee.js"><link rel="prefetch" href="/assets/js/696.de10297f.js"><link rel="prefetch" href="/assets/js/697.96d04062.js"><link rel="prefetch" href="/assets/js/698.200cc84f.js"><link rel="prefetch" href="/assets/js/699.f11fc627.js"><link rel="prefetch" href="/assets/js/7.c16198b8.js"><link rel="prefetch" href="/assets/js/70.5f6285b1.js"><link rel="prefetch" href="/assets/js/700.93d48f59.js"><link rel="prefetch" href="/assets/js/701.b861f29a.js"><link rel="prefetch" href="/assets/js/702.dc82e05c.js"><link rel="prefetch" href="/assets/js/703.625ce87c.js"><link rel="prefetch" href="/assets/js/704.005a0a7c.js"><link rel="prefetch" href="/assets/js/705.16ad9230.js"><link rel="prefetch" href="/assets/js/706.4eead30a.js"><link rel="prefetch" href="/assets/js/707.730306ce.js"><link rel="prefetch" href="/assets/js/708.e37e743a.js"><link rel="prefetch" href="/assets/js/709.f2144f52.js"><link rel="prefetch" href="/assets/js/71.d5d0dae5.js"><link rel="prefetch" href="/assets/js/710.ee9d9b17.js"><link rel="prefetch" href="/assets/js/711.2813c338.js"><link rel="prefetch" href="/assets/js/712.e801bce4.js"><link rel="prefetch" href="/assets/js/713.21fc267c.js"><link rel="prefetch" href="/assets/js/714.4ec35525.js"><link rel="prefetch" href="/assets/js/715.fdc3cc84.js"><link rel="prefetch" href="/assets/js/716.324932ad.js"><link rel="prefetch" href="/assets/js/717.a072a66f.js"><link rel="prefetch" href="/assets/js/718.575e0305.js"><link rel="prefetch" href="/assets/js/719.5fdd55de.js"><link rel="prefetch" href="/assets/js/72.25648231.js"><link rel="prefetch" href="/assets/js/720.61477f23.js"><link rel="prefetch" href="/assets/js/721.c8bdab00.js"><link rel="prefetch" href="/assets/js/722.9255f385.js"><link rel="prefetch" href="/assets/js/723.f27792a4.js"><link rel="prefetch" href="/assets/js/724.cd504f88.js"><link rel="prefetch" href="/assets/js/725.55c845fa.js"><link rel="prefetch" href="/assets/js/726.bb49a9db.js"><link rel="prefetch" href="/assets/js/727.53d587fe.js"><link rel="prefetch" href="/assets/js/728.86972387.js"><link rel="prefetch" href="/assets/js/729.02fa0263.js"><link rel="prefetch" href="/assets/js/73.29902c1f.js"><link rel="prefetch" href="/assets/js/730.817156d1.js"><link rel="prefetch" href="/assets/js/731.6f5d6735.js"><link rel="prefetch" href="/assets/js/732.9a5ff781.js"><link rel="prefetch" href="/assets/js/733.bcb13916.js"><link rel="prefetch" href="/assets/js/734.11482b19.js"><link rel="prefetch" href="/assets/js/735.8c0d62f3.js"><link rel="prefetch" href="/assets/js/736.06465705.js"><link rel="prefetch" href="/assets/js/737.79741d87.js"><link rel="prefetch" href="/assets/js/738.cad12ff9.js"><link rel="prefetch" href="/assets/js/739.cb09e552.js"><link rel="prefetch" href="/assets/js/74.bcf666a0.js"><link rel="prefetch" href="/assets/js/740.029b1950.js"><link rel="prefetch" href="/assets/js/741.b937216a.js"><link rel="prefetch" href="/assets/js/742.ec02c706.js"><link rel="prefetch" href="/assets/js/743.70a96283.js"><link rel="prefetch" href="/assets/js/744.909b870c.js"><link rel="prefetch" href="/assets/js/745.80defb2d.js"><link rel="prefetch" href="/assets/js/746.fb972248.js"><link rel="prefetch" href="/assets/js/747.1a7b52fd.js"><link rel="prefetch" href="/assets/js/748.036f5d16.js"><link rel="prefetch" href="/assets/js/749.bd9a413d.js"><link rel="prefetch" href="/assets/js/75.23c5a54d.js"><link rel="prefetch" href="/assets/js/750.3f1ae8f5.js"><link rel="prefetch" href="/assets/js/751.8897bc9f.js"><link rel="prefetch" href="/assets/js/752.9b387659.js"><link rel="prefetch" href="/assets/js/753.f411ce21.js"><link rel="prefetch" href="/assets/js/754.26def684.js"><link rel="prefetch" href="/assets/js/755.923aff62.js"><link rel="prefetch" href="/assets/js/756.9965743a.js"><link rel="prefetch" href="/assets/js/757.0c6bbbfd.js"><link rel="prefetch" href="/assets/js/758.a830f8b1.js"><link rel="prefetch" href="/assets/js/759.987cad77.js"><link rel="prefetch" href="/assets/js/76.f54f3d4f.js"><link rel="prefetch" href="/assets/js/760.9f2652a0.js"><link rel="prefetch" href="/assets/js/761.df01a0ee.js"><link rel="prefetch" href="/assets/js/762.e0c05a1a.js"><link rel="prefetch" href="/assets/js/763.da8a60bd.js"><link rel="prefetch" href="/assets/js/764.9f2a2830.js"><link rel="prefetch" href="/assets/js/765.44e61161.js"><link rel="prefetch" href="/assets/js/766.cd7da8c1.js"><link rel="prefetch" href="/assets/js/767.6ea1fea2.js"><link rel="prefetch" href="/assets/js/768.91529b8f.js"><link rel="prefetch" href="/assets/js/769.194d7a3e.js"><link rel="prefetch" href="/assets/js/77.3d43a163.js"><link rel="prefetch" href="/assets/js/770.227fd5b9.js"><link rel="prefetch" href="/assets/js/771.44d5e37e.js"><link rel="prefetch" href="/assets/js/772.234d9bf6.js"><link rel="prefetch" href="/assets/js/773.ff1dfb6a.js"><link rel="prefetch" href="/assets/js/774.d401364f.js"><link rel="prefetch" href="/assets/js/775.37a7cf41.js"><link rel="prefetch" href="/assets/js/776.0cd10853.js"><link rel="prefetch" href="/assets/js/777.599a3a48.js"><link rel="prefetch" href="/assets/js/778.eef27a95.js"><link rel="prefetch" href="/assets/js/779.29351199.js"><link rel="prefetch" href="/assets/js/78.fd0780ac.js"><link rel="prefetch" href="/assets/js/780.74caed94.js"><link rel="prefetch" href="/assets/js/781.ee0fa9b5.js"><link rel="prefetch" href="/assets/js/782.7cffed09.js"><link rel="prefetch" href="/assets/js/783.7f01f518.js"><link rel="prefetch" href="/assets/js/784.5f65e3d7.js"><link rel="prefetch" href="/assets/js/785.d7e13880.js"><link rel="prefetch" href="/assets/js/786.6110d12f.js"><link rel="prefetch" href="/assets/js/787.334a5cdd.js"><link rel="prefetch" href="/assets/js/788.f261bc71.js"><link rel="prefetch" href="/assets/js/789.b6d74f7d.js"><link rel="prefetch" href="/assets/js/79.7b5d6224.js"><link rel="prefetch" href="/assets/js/790.fa948ec4.js"><link rel="prefetch" href="/assets/js/791.22080013.js"><link rel="prefetch" href="/assets/js/792.31ce806c.js"><link rel="prefetch" href="/assets/js/793.9fd0c56f.js"><link rel="prefetch" href="/assets/js/794.44a8cd9c.js"><link rel="prefetch" href="/assets/js/795.9f8346e5.js"><link rel="prefetch" href="/assets/js/796.0de9c7a1.js"><link rel="prefetch" href="/assets/js/797.83ac32a6.js"><link rel="prefetch" href="/assets/js/798.393fc81d.js"><link rel="prefetch" href="/assets/js/799.c1fb3981.js"><link rel="prefetch" href="/assets/js/8.3275ed06.js"><link rel="prefetch" href="/assets/js/80.df3f0a1f.js"><link rel="prefetch" href="/assets/js/800.2832adeb.js"><link rel="prefetch" href="/assets/js/801.04c58fc4.js"><link rel="prefetch" href="/assets/js/81.3d90ef6b.js"><link rel="prefetch" href="/assets/js/82.2d42448d.js"><link rel="prefetch" href="/assets/js/83.900b4de2.js"><link rel="prefetch" href="/assets/js/84.ff570f67.js"><link rel="prefetch" href="/assets/js/85.e3b3af39.js"><link rel="prefetch" href="/assets/js/86.17b5aedc.js"><link rel="prefetch" href="/assets/js/87.f931d1d6.js"><link rel="prefetch" href="/assets/js/88.d55863cd.js"><link rel="prefetch" href="/assets/js/89.15a9a6d7.js"><link rel="prefetch" href="/assets/js/9.04948a9d.js"><link rel="prefetch" href="/assets/js/90.22696aa9.js"><link rel="prefetch" href="/assets/js/91.f1bd8a2e.js"><link rel="prefetch" href="/assets/js/92.85733094.js"><link rel="prefetch" href="/assets/js/93.59bacfd7.js"><link rel="prefetch" href="/assets/js/94.a5f9b7a0.js"><link rel="prefetch" href="/assets/js/95.be52d65a.js"><link rel="prefetch" href="/assets/js/96.0b76ba8e.js"><link rel="prefetch" href="/assets/js/97.28183cd4.js"><link rel="prefetch" href="/assets/js/98.2d22829c.js"><link rel="prefetch" href="/assets/js/99.ed602a20.js">
    <link rel="stylesheet" href="/assets/css/0.styles.a3df589e.css">
  </head>
  <body>
    <div id="app" data-server-rendered="true"><div class="theme-container"><header class="navbar"><div class="sidebar-button"><svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" role="img" viewBox="0 0 448 512" class="icon"><path fill="currentColor" d="M436 124H12c-6.627 0-12-5.373-12-12V80c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12zm0 160H12c-6.627 0-12-5.373-12-12v-32c0-6.627 5.373-12 12-12h424c6.627 0 12 5.373 12 12v32c0 6.627-5.373 12-12 12z"></path></svg></div> <a href="/" class="home-link router-link-active"><!----> <span class="site-name">AJ</span></a> <div class="links"><div class="search-box"><input aria-label="Search" autocomplete="off" spellcheck="false" value=""> <!----></div> <nav class="nav-links can-hide"><div class="nav-item"><a href="/" class="nav-link">主页</a></div><div class="nav-item"><a href="/op/" class="nav-link">Devops</a></div><div class="nav-item"><a href="/golang/" class="nav-link">Go</a></div><div class="nav-item"><a href="/go-block/" class="nav-link router-link-active">区块链</a></div><div class="nav-item"><a href="/k8s/" class="nav-link">k8s</a></div><div class="nav-item"><a href="/about.html" class="nav-link">关于我</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="更多" class="dropdown-title"><span class="title">更多</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/go-learning/" class="nav-link">go-learning</a></li><li class="dropdown-item"><!----> <a href="/post/flutter-guide/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/mysql/" class="nav-link">mysql</a></li><li class="dropdown-item"><!----> <a href="/python/" class="nav-link">python</a></li></ul></div></div> <a href="https://github.com/ChinaArJun" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav></div></header> <div class="sidebar-mask"></div> <aside class="sidebar"><nav class="nav-links"><div class="nav-item"><a href="/" class="nav-link">主页</a></div><div class="nav-item"><a href="/op/" class="nav-link">Devops</a></div><div class="nav-item"><a href="/golang/" class="nav-link">Go</a></div><div class="nav-item"><a href="/go-block/" class="nav-link router-link-active">区块链</a></div><div class="nav-item"><a href="/k8s/" class="nav-link">k8s</a></div><div class="nav-item"><a href="/about.html" class="nav-link">关于我</a></div><div class="nav-item"><div class="dropdown-wrapper"><button type="button" aria-label="更多" class="dropdown-title"><span class="title">更多</span> <span class="arrow right"></span></button> <ul class="nav-dropdown" style="display:none;"><li class="dropdown-item"><!----> <a href="/go-learning/" class="nav-link">go-learning</a></li><li class="dropdown-item"><!----> <a href="/post/flutter-guide/" class="nav-link">flutter</a></li><li class="dropdown-item"><!----> <a href="/mysql/" class="nav-link">mysql</a></li><li class="dropdown-item"><!----> <a href="/python/" class="nav-link">python</a></li></ul></div></div> <a href="https://github.com/ChinaArJun" target="_blank" rel="noopener noreferrer" class="repo-link">
    GitHub
    <svg xmlns="http://www.w3.org/2000/svg" aria-hidden="true" x="0px" y="0px" viewBox="0 0 100 100" width="15" height="15" class="icon outbound"><path fill="currentColor" d="M18.8,85.1h56l0,0c2.2,0,4-1.8,4-4v-32h-8v28h-48v-48h28v-8h-32l0,0c-2.2,0-4,1.8-4,4v56C14.8,83.3,16.6,85.1,18.8,85.1z"></path> <polygon fill="currentColor" points="45.7,48.7 51.3,54.3 77.2,28.5 77.2,37.2 85.2,37.2 85.2,14.9 62.8,14.9 62.8,22.9 71.5,22.9"></polygon></svg></a></nav> <div></div> <div style="padding-left:1.5rem;"><div></div></div> <ul class="sidebar-links"><li><section class="sidebar-group depth-0"><p class="sidebar-heading open"><span>区块链基础</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/blockchain/encryption-expand.html" class="sidebar-link">常见的密码技术</a></li><li><a href="/go-block/blockchain/encryption.html" class="sidebar-link">密码学安全</a></li><li><a href="/go-block/blockchain/ethereum.html" class="sidebar-link">以太坊智能合约</a></li><li><a href="/go-block/blockchain/hyperledgerfabric.html" class="sidebar-link">hyperledger fabric</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Hyperledger Fabric 1.2</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/fabric/1搭建网络-纯手动.html" class="sidebar-link">1搭建网络-纯手动</a></li><li><a href="/go-block/fabric/1环境搭建.html" class="sidebar-link">1环境搭建</a></li><li><a href="/go-block/fabric/2Fabric介绍.html" class="sidebar-link">2Fabric介绍</a></li><li><a href="/go-block/fabric/3Fabric核心模块.html" class="sidebar-link">3Fabric核心模块</a></li><li><a href="/go-block/fabric/4网络搭建-脚本.html" class="sidebar-link">4网络搭建-脚本</a></li><li><a href="/go-block/fabric/5智能合约.html" class="sidebar-link">5智能合约</a></li><li><a href="/go-block/fabric/6Fabric账号.html" class="sidebar-link">6Fabric账号</a></li><li><a href="/go-block/fabric/7Solo多机多节点部署.html" class="sidebar-link">7Solo多机多节点部署</a></li><li><a href="/go-block/fabric/8Kafka多机多节点部署.html" class="sidebar-link">8Kafka多机多节点部署</a></li></ul></section></li><li><section class="sidebar-group depth-0"><p class="sidebar-heading"><span>Hyperledger Fabric 2.X</span> <!----></p> <ul class="sidebar-links sidebar-group-items"><li><a href="/go-block/fabric2.x/" aria-current="page" class="sidebar-link">2.X目录</a></li></ul></section></li></ul> </aside> <!----> <!----> <main class="page"><div class="theme-default-content" style="margin-bottom:-5rem;"><div class="bar"><div class="bar-intro"><div class="text">
      流逝的是岁月，不变的是情怀.
        </div> <div class="text">
      坚持学习，是为了成就更好的自己. <br></div> <div>公众号[中关村程序员]</div></div></div> <!----></div> <div class="theme-default-content content__default"><h2 id="_3-fabric核心模块"><a href="#_3-fabric核心模块" class="header-anchor">#</a> 3.  Fabric核心模块</h2> <p>Fabric是一个由五个核心模块组成的程序组. 在fabric在成功编译完成之后, 一共会有五个核心模块, 如下:</p> <table><thead><tr><th style="text-align:center;">模块名称</th> <th style="text-align:center;">功能</th></tr></thead> <tbody><tr><td style="text-align:center;"><code>peer</code></td> <td style="text-align:center;">主节点模块, 负责存储区块链数据, 运行维护链码</td></tr> <tr><td style="text-align:center;"><code>orderer</code></td> <td style="text-align:center;">交易打包, 排序模块</td></tr> <tr><td style="text-align:center;"><code>cryptogen</code></td> <td style="text-align:center;">组织和证书生成模块</td></tr> <tr><td style="text-align:center;"><code>configtxgen</code></td> <td style="text-align:center;">区块和交易生成模块</td></tr> <tr><td style="text-align:center;"><code>configtxlator</code></td> <td style="text-align:center;">区块和交易解析模块</td></tr></tbody></table> <blockquote><p>五个模块中<code>peer</code>和<code>orderer</code>属于系统模块, <code>cryptogen</code>, <code>configtxgen</code>, <code>configtxlator</code>属于工具模块。工具模块负责证书文件、区块链创始块、通道创始块等相关文件和证书的生成工作，但是工具模块不参与系统的运行。peer模块和 orderer 模块作为系统模块是Fabric的核心模块，启动之后会以守护进程的方式在系统后台长期运行。</p> <p>Fabric的5个核心模块都是基于命令行的方式运行的，目前Fabric没有为这些模块提供相关的图形界面，因此想要熟练使用Fabric的这些核心模块，必须熟悉这些模块的命令选项。</p></blockquote> <h3 id="_3-1-cryptogen"><a href="#_3-1-cryptogen" class="header-anchor">#</a> 3.1 cryptogen</h3> <blockquote><p><font color="red">cryptogen模块主要用来生成组织结构和账号相关的文件</font>，任何Fabric系统的开发通常都是从cryptogen模块开始的。在Fabric项目中，当系统设计完成之后第一项工作就是根据系统的设计来编写cryptogen的配置文件，然后通过这些配置文件生成相关的证书文件。</p> <p>cryptogen模块所使用的配置文件是整个Fabric项目的基石。下面我们将介绍cryptogen模块命令行选项及其使用方式。</p></blockquote> <h4 id="cryptogen-模块命令"><a href="#cryptogen-模块命令" class="header-anchor">#</a> cryptogen 模块命令</h4> <blockquote><p>cryptogen模块是通过命令行的方式运行的，一个cryptogen命令由命令行参数和配置文件两部分组成，通过执行命令<code>cryptogen --help</code>可以显示cryptogen模块的命令行选项，执行结果如下所示：</p></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code>$ cryptogen --help
usage: cryptogen <span class="token punctuation">[</span><span class="token operator">&lt;</span>flags<span class="token operator">&gt;</span><span class="token punctuation">]</span> <span class="token operator">&lt;</span>command<span class="token operator">&gt;</span> <span class="token punctuation">[</span><span class="token operator">&lt;</span>args<span class="token operator">&gt;</span> <span class="token punctuation">..</span>.<span class="token punctuation">]</span>
Utility <span class="token keyword">for</span> generating Hyperledger Fabric key material
Flags:
  --help  Show context-sensitive <span class="token builtin class-name">help</span> <span class="token punctuation">(</span>also try --help-long and --help-man<span class="token punctuation">)</span>.
Commands:
   <span class="token comment"># 显示帮助信息</span>
  <span class="token variable"><span class="token variable">`</span><span class="token builtin class-name">help</span> <span class="token punctuation">[</span><span class="token operator">&lt;</span>command<span class="token operator">&gt;</span><span class="token punctuation">..</span>.<span class="token punctuation">]</span>
   <span class="token comment"># 根据配置文件生成证书信息。</span>
  <span class="token variable">`</span></span>generate <span class="token punctuation">[</span><span class="token operator">&lt;</span>flags<span class="token operator">&gt;</span><span class="token punctuation">]</span>	
   <span class="token comment"># 显示系统默认的cryptogen模块配置文件信息</span>
  <span class="token variable"><span class="token variable">`</span>showtemplate
   <span class="token comment"># 显示当前模块版本号</span>
  <span class="token variable">`</span></span>version<span class="token variable"><span class="token variable">`</span>
   <span class="token comment"># 扩展现有网络</span>
  <span class="token variable">`</span></span>extend <span class="token punctuation">[</span><span class="token operator">&lt;</span>flags<span class="token operator">&gt;</span><span class="token punctuation">]</span>
</code></pre></div><h4 id="cryptogen-模块配置文件"><a href="#cryptogen-模块配置文件" class="header-anchor">#</a> cryptogen 模块配置文件</h4> <blockquote><p>cryptogen模块的配置文件用来描述需要生成的证书文件的特性，比如：有多少个组织有多少个节点，需要多少个账号等。这里我们通过一个cryptogen模块配置文件的具体例子来初步了解配置文件的结构，该例子是Fabric源代码中自带的示例 -  crypto-config.yaml:</p> <p><font color="red">这个配置文件的名字可以根据自己的意愿进行自定义, 即: xxx.yaml</font></p></blockquote> <div class="language-yaml extra-class"><pre class="language-yaml"><code><span class="token key atrule">OrdererOrgs</span><span class="token punctuation">:</span>					<span class="token comment"># 排序节点的组织定义</span>
  <span class="token punctuation">-</span> <span class="token key atrule">Name</span><span class="token punctuation">:</span> Orderer				<span class="token comment"># orderer节点的名称</span>
 	<span class="token key atrule">Domain</span><span class="token punctuation">:</span> example.com			<span class="token comment"># orderer节点的根域名 </span>
 	<span class="token key atrule">Specs</span><span class="token punctuation">:</span>
	    <span class="token punctuation">-</span> <span class="token key atrule">Hostname</span><span class="token punctuation">:</span> orderer		<span class="token comment"># orderer节点的主机名</span>
<span class="token key atrule">PeerOrgs</span><span class="token punctuation">:</span>						<span class="token comment"># peer节点的组织定义</span>
  <span class="token punctuation">-</span> <span class="token key atrule">Name</span><span class="token punctuation">:</span> Org1					<span class="token comment"># 组织1的名称	1	1</span>
	<span class="token key atrule">Domain</span><span class="token punctuation">:</span> org1.example.com	<span class="token comment"># 组织1的根域名</span>
 	<span class="token key atrule">EnableNodeOUs</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>			<span class="token comment"># 是否支持node.js</span>
 	<span class="token key atrule">Template</span><span class="token punctuation">:</span>					
	    <span class="token key atrule">Count</span><span class="token punctuation">:</span> <span class="token number">2</span>				<span class="token comment"># 组织1中的节点(peer)数目</span>
	<span class="token key atrule">Users</span><span class="token punctuation">:</span>
 	    <span class="token key atrule">Count</span><span class="token punctuation">:</span> <span class="token number">1</span>				<span class="token comment"># 组织1中的用户数目</span>
  <span class="token punctuation">-</span> <span class="token key atrule">Name</span><span class="token punctuation">:</span> Org2
    <span class="token key atrule">Domain</span><span class="token punctuation">:</span> org2.example.com
    <span class="token key atrule">EnableNodeOUs</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
    <span class="token key atrule">Template</span><span class="token punctuation">:</span>
        <span class="token key atrule">Count</span><span class="token punctuation">:</span> <span class="token number">2</span>
    <span class="token key atrule">Users</span><span class="token punctuation">:</span>
        <span class="token key atrule">Count</span><span class="token punctuation">:</span> <span class="token number">1</span>
</code></pre></div><blockquote><p>上述模板文件定义了一个orderer节点，这个orderer节点的名字为orderer，orderer节点的根域名为example.com，主机名为orderer。模板文件同时定义了两个组织，两个组织的名字分别为org1 和 org2，其中组织 org1 包含了2个节点和1个用户，组织 org2 包含2个点和1个用户。</p> <p>除了Fabric源码中提供的例子，还可以通过命令<code>cryptogen showtemplate</code>获取默认的模板文件，在实际项目中稍加修改这些默认的模板文件即可使用。</p></blockquote> <h4 id="生成证书文件"><a href="#生成证书文件" class="header-anchor">#</a> 生成证书文件</h4> <blockquote><p>在任意目录下创建一个新的目录如: MyTestNetWork， 在该目录下左如下操作：</p> <ul><li>编写yaml配置文件 - crypto-config.yaml
<ul><li>一个排序节点： orader
<ul><li>根域名：itcast.com</li></ul></li> <li>两个组织： java， go
<ul><li>go
<ul><li>peer节点数： 3个</li> <li>用户个数： 2个</li> <li>根域名：go.itcast.com</li></ul></li> <li>java
<ul><li>peer节点数： 3个</li> <li>用户个数： 2个</li> <li>根域名: java.itcast.com</li></ul></li></ul></li></ul></li></ul></blockquote> <ul><li><p>命令</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 根据默认模板在对应目录下生成证书</span>
$ cryptogen generate
<span class="token comment"># 根据指定的模板在指定目录下生成证书</span>
$ cryptogen generate --config<span class="token operator">=</span>./crycrypto-config.yaml --output ./crypto-config
	--config: 指定配置文件
	--output: 指定证书文件的存储位置, 可以不指定。会在对应路径生成目录，默认名字为：crypto-config
</code></pre></div></li> <li><p>Fabric证书文件结构</p> <ul><li><p>orderer节点</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 查看TestNetWork目录</span>
itcast@ubuntu:~/TestNetWork$ tree -L <span class="token number">2</span>
<span class="token builtin class-name">.</span>
├── crypto-config
│   ├── ordererOrganizations	<span class="token comment"># orderer节点相关的证书文件</span>
│   └── peerOrganizations		<span class="token comment"># 组织相关的证书文件(组织的节点数, 用户数等证书文件)</span>
└── crypto-config.yaml			<span class="token comment"># 配置文件</span>

<span class="token comment"># 查看排序节点的证书目录, 进入到 ordererOrganizations 子目录中</span>
itcast@ubuntu:ordererOrganizations$ tree -L <span class="token number">4</span>
<span class="token builtin class-name">.</span>
└── itcast.com	<span class="token comment"># 根域名为itcast.com的orderer节点的相关证书文件</span>
    ├── ca	<span class="token comment"># CA服务器的签名文件</span>
    │   ├── 94db924d3be00c5adda6ac3c3cb7a5f8b80868681c3dd04b58c2920cdf56fdc7_sk
    │   └── ca.itcast.com-cert.pem
    ├── msp
    │   ├── admincerts	<span class="token comment"># orderer管理员的证书</span>
    │   │   └── Admin@itcast.com-cert.pem
    │   ├── cacerts		<span class="token comment"># orderer根域名服务器的签名证书</span>
    │   │   └── ca.itcast.com-cert.pem
    │   └── tlscacerts	<span class="token comment"># tls连接用的身份证书</span>
    │       └── tlsca.itcast.com-cert.pem
    ├── orderers	<span class="token comment"># orderer节点需要的相关的证书文件</span>
    │   └── ubuntu.itcast.com
    │       ├── msp	<span class="token comment"># orderer节点相关证书</span>
    │       └── tls	<span class="token comment"># orderer节点和其他节点连接用的身份证书</span>
    ├── tlsca
    │   ├── de45aeb112ee820197f7d4d475f2edbeb1705d53a690f3537dd794b66de1d6ba_sk
    │   └── tlsca.itcast.com-cert.pem
    └── <span class="token function">users</span>	<span class="token comment"># orderer节点用户相关的证书</span>
        └── Admin@itcast.com
            ├── msp
            └── tls
</code></pre></div><blockquote><p>在实际开发中orderer节点这些证书其实不需要直接使用, 只是在orderer节点启动时指明项目的位置即可。</p></blockquote></li> <li><p>Peer节点</p> <blockquote><p>进入到 peerOrganizations 子目录中,  我们详细介绍这些证书的种类和作用。由于每个组织的目录结构都是一样的， 所以我们只对其中一个组织的目录进行详细介绍。</p></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 查看 peerOrganizations 子目录中内容</span>
itcast@ubuntu:peerOrganizations$ tree -L <span class="token number">1</span>
<span class="token builtin class-name">.</span>
├── go.itcast.com		<span class="token comment"># go组织</span>
└── java.itcast.com		<span class="token comment"># java组织</span>
<span class="token comment"># 进入go.itcast.com 组织目录中</span>
itcast@ubuntu:go.itcast.com$ tree -L <span class="token number">4</span>
<span class="token builtin class-name">.</span>
├── ca 	<span class="token comment"># 根节点签名证书</span>
│   ├── 4a367bf9e43142846e7c851830f69f72483ecb7a6def7c782278a9808bbb5fb0_sk
│   └── ca.go.itcast.com-cert.pem
├── msp	
│   ├── admincerts	<span class="token comment"># 组织管理员的证书</span>
│   │   └── Admin@go.itcast.com-cert.pem
│   ├── cacerts		<span class="token comment"># 组织的根证书</span>
│   │   └── ca.go.itcast.com-cert.pem
│   ├── config.yaml
│   └── tlscacerts	<span class="token comment"># TLS连接身份证书</span>
│       └── tlsca.go.itcast.com-cert.pem
├── peers
│   ├── peer0.go.itcast.com
│   │   ├── msp
│   │   │   ├── admincerts	<span class="token comment"># 组织的管理证书, 创建通道必须要有该证书</span>
│   │   │   ├── cacerts		<span class="token comment"># 组织根证书</span>
│   │   │   ├── config.yaml	
│   │   │   ├── keystore	<span class="token comment"># 当前节点的私钥</span>
│   │   │   ├── signcerts	<span class="token comment"># 当前节点签名的数字证书</span>
│   │   │   └── tlscacerts	<span class="token comment"># tls连接的身份证书</span>
│   │   └── tls
│   │       ├── ca.crt		<span class="token comment"># 组织的根证书</span>
│   │       ├── server.crt	<span class="token comment"># 验证本节点签名的证书</span>
│   │       └── server.key	<span class="token comment"># 当前节点的私钥</span>
│   ├── peer1.go.itcast.com
│   │   ├── msp
│   │   │   ├── admincerts
│   │   │   ├── cacerts
│   │   │   ├── config.yaml
│   │   │   ├── keystore
│   │   │   ├── signcerts
│   │   │   └── tlscacerts
│   │   └── tls
│   │       ├── ca.crt
│   │       ├── server.crt
│   │       └── server.key
│   └── peer2.go.itcast.com
│       ├── msp
│       │   ├── admincerts
│       │   ├── cacerts
│       │   ├── config.yaml
│       │   ├── keystore
│       │   ├── signcerts
│       │   └── tlscacerts
│       └── tls
│           ├── ca.crt
│           ├── server.crt
│           └── server.key
├── tlsca
│   ├── 3273887b1da2f27a6cbad3ac4acb0379df3d7858e0553a91fb9acb93da50b670_sk
│   └── tlsca.go.itcast.com-cert.pem
└── <span class="token function">users</span>
    ├── Admin@go.itcast.com
    │   ├── msp
    │   │   ├── admincerts	<span class="token comment"># 组织的根证书, 作为管理身份的验证</span>
    │   │   ├── cacerts		<span class="token comment"># 用户所属组织的根证书</span>
    │   │   ├── keystore	<span class="token comment"># 用户私钥</span>
    │   │   ├── signcerts	<span class="token comment"># 用户的签名证书</span>
    │   │   └── tlscacerts	<span class="token comment"># tls连接通信证书, sdk客户端使用</span>
    │   └── tls
    │       ├── ca.crt		<span class="token comment"># 组织的根证书</span>
    │       ├── client.crt	<span class="token comment"># 客户端身份的证书</span>
    │       └── client.key	<span class="token comment"># 客户端的私钥</span>
    ├── User1@go.itcast.com
    │   ├── msp
    │   │   ├── admincerts
    │   │   ├── cacerts
    │   │   ├── keystore
    │   │   ├── signcerts
    │   │   └── tlscacerts
    │   └── tls
    │       ├── ca.crt
    │       ├── client.crt
    │       └── client.key
    └── User2@go.itcast.com
        ├── msp
        │   ├── admincerts
        │   ├── cacerts
        │   ├── keystore
        │   ├── signcerts
        │   └── tlscacerts
        └── tls
            ├── ca.crt
            ├── client.crt
            └── client.key
</code></pre></div></li></ul></li></ul> <h3 id="_3-2-configtxgen"><a href="#_3-2-configtxgen" class="header-anchor">#</a> 3.2 configtxgen</h3> <blockquote><p>configtxgen 模块的功能一共有两个:</p> <ul><li>生成 orderer 节点的初始化文件</li> <li>生成 channel 的初始化文件</li></ul></blockquote> <h4 id="configtxgen-模块命令"><a href="#configtxgen-模块命令" class="header-anchor">#</a> configtxgen 模块命令</h4> <blockquote><p>configtxgen 模块是通过命令行的方式运行的，通过执行命令<code>configtxgen --help</code>可以显示 configtxgen 模块的命令行选项，执行结果如下所示：</p></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code>$ configtxgen --help
Usage of ./configtxgen:
  <span class="token comment"># 指定所属的组织</span>
  <span class="token variable"><span class="token variable">`</span>-asOrg string<span class="token variable">`</span></span>
        Performs the config generation as a particular organization <span class="token punctuation">(</span>by name<span class="token punctuation">)</span>, only 
        including values <span class="token keyword">in</span> the <span class="token function">write</span> <span class="token builtin class-name">set</span> that org <span class="token punctuation">(</span>likely<span class="token punctuation">)</span> has privilege to <span class="token builtin class-name">set</span>
  <span class="token comment"># 指定创建的channel的名字, 如果没指定系统会提供一个默认的名字.</span>
  <span class="token variable"><span class="token variable">`</span>-channelID string<span class="token variable">`</span></span>
        The channel ID to use <span class="token keyword">in</span> the configtx
  <span class="token comment"># 执行命令要加载的配置文件的路径, 不指定会在当前目录下查找</span>
  -configPath string
        The path containing the configuration to use <span class="token punctuation">(</span>if <span class="token builtin class-name">set</span><span class="token punctuation">)</span>
  <span class="token comment"># 打印指定区块文件中的配置内容，string：查看的区块文件的名字</span>
  -inspectBlock string
        Prints the configuration contained <span class="token keyword">in</span> the block at the specified path
  <span class="token comment"># 打印创建通道的交易的配置文件</span>
  -inspectChannelCreateTx string
        Prints the configuration contained <span class="token keyword">in</span> the transaction at the specified path
  <span class="token comment"># 指定锚节点更新文件的路径和名字</span>
  <span class="token variable"><span class="token variable">`</span>-outputAnchorPeersUpdate string<span class="token variable">`</span></span>
        Creates an config update to update an anchor peer <span class="token punctuation">(</span>works only with the default 
        channel creation, and only <span class="token keyword">for</span> the first update<span class="token punctuation">)</span>
  <span class="token comment"># 指定生成的创始区块文件的路径和名字</span>
  <span class="token variable"><span class="token variable">`</span>-outputBlock string<span class="token variable">`</span></span>
        The path to <span class="token function">write</span> the genesis block to <span class="token punctuation">(</span>if <span class="token builtin class-name">set</span><span class="token punctuation">)</span>
  <span class="token comment"># 标示输出的通道文件路径和名字</span>
  <span class="token variable"><span class="token variable">`</span>-outputCreateChannelTx string<span class="token variable">`</span></span>
        The path to <span class="token function">write</span> a channel creation configtx to <span class="token punctuation">(</span>if <span class="token builtin class-name">set</span><span class="token punctuation">)</span>
  <span class="token comment">#  将组织的定义打印为JSON(这对在组织中手动添加一个通道很有用)。</span>
  -printOrg string
        Prints the definition of an organization as JSON. <span class="token punctuation">(</span>useful <span class="token keyword">for</span> adding an org to
        a channel manually<span class="token punctuation">)</span>
  <span class="token comment"># 指定配置文件中的节点 - configtx.yaml</span>
  <span class="token variable"><span class="token variable">`</span>-profile string<span class="token variable">`</span></span>
        The profile from configtx.yaml to use <span class="token keyword">for</span> generation. <span class="token punctuation">(</span>default
        <span class="token string">&quot;SampleInsecureSolo&quot;</span><span class="token punctuation">)</span>
  <span class="token comment"># 显示版本信息</span>
  -version
        Show version information
</code></pre></div><h4 id="configtxgen模块配置文件"><a href="#configtxgen模块配置文件" class="header-anchor">#</a> configtxgen模块配置文件</h4> <blockquote><p>configtxgen 模块的配置文件包含Fabric系统初始块、Channel初始块文件等信息。configtxgen 模块的配置文件样例如下所示，以下部分定义了整个系统的配置信息：</p></blockquote> <div class="language-yaml extra-class"><pre class="language-yaml"><code><span class="token key atrule">Profiles</span><span class="token punctuation">:</span>
	<span class="token comment"># 组织定义标识符，可自定义，命令中的 -profile 参数对应该标识符， 二者要保持一致</span>
    <span class="token key atrule">ItcastOrgsOrdererGenesis</span><span class="token punctuation">:</span>
        <span class="token key atrule">Capabilities</span><span class="token punctuation">:</span>
            <span class="token key atrule">&lt;&lt;</span><span class="token punctuation">:</span> <span class="token important">*ChannelCapabilities</span>	<span class="token comment"># 引用下面为 ChannelCapabilities 的属性</span>
        <span class="token key atrule">Orderer</span><span class="token punctuation">:</span>						<span class="token comment"># 配置属性，系统关键字，不能修改</span>
            <span class="token key atrule">&lt;&lt;</span><span class="token punctuation">:</span> <span class="token important">*OrdererDefaults</span>		<span class="token comment"># 引用下面为 OrdererDefaults 的属性</span>
            <span class="token key atrule">Organizations</span><span class="token punctuation">:</span>
                <span class="token punctuation">-</span> <span class="token important">*OrdererOrg</span>			<span class="token comment"># 引用下面为 OrdererOrg 的属性</span>
            <span class="token key atrule">Capabilities</span><span class="token punctuation">:</span>
                <span class="token key atrule">&lt;&lt;</span><span class="token punctuation">:</span> <span class="token important">*OrdererCapabilities</span> <span class="token comment"># 引用下面为 OrdererCapabilities 的属性</span>
        <span class="token key atrule">Consortiums</span><span class="token punctuation">:</span>					<span class="token comment"># 定义了系统中包含的组织</span>
            <span class="token key atrule">SampleConsortium</span><span class="token punctuation">:</span>
                <span class="token key atrule">Organizations</span><span class="token punctuation">:</span>			<span class="token comment"># 系统中包含的组织</span>
                    <span class="token punctuation">-</span> <span class="token important">*OrgGo</span>				<span class="token comment"># 引用了下文包含的配置</span>
                    <span class="token punctuation">-</span> <span class="token important">*OrgJava</span>
    <span class="token comment"># 通道定义标识符，可自定义</span>
    <span class="token key atrule">TwoOrgsChannel</span><span class="token punctuation">:</span>	
        <span class="token key atrule">Consortium</span><span class="token punctuation">:</span> SampleConsortium
        <span class="token key atrule">Application</span><span class="token punctuation">:</span>
            <span class="token key atrule">&lt;&lt;</span><span class="token punctuation">:</span> <span class="token important">*ApplicationDefaults</span>
            <span class="token key atrule">Organizations</span><span class="token punctuation">:</span>
                <span class="token punctuation">-</span> <span class="token important">*OrgGo</span>
                <span class="token punctuation">-</span> <span class="token important">*OrgJava</span>
            <span class="token key atrule">Capabilities</span><span class="token punctuation">:</span>
                <span class="token key atrule">&lt;&lt;</span><span class="token punctuation">:</span> <span class="token important">*ApplicationCapabilities</span>
                
<span class="token comment"># 所有的值使用默认的true即可， 不要修改                </span>
<span class="token key atrule">Capabilities</span><span class="token punctuation">:</span>
    <span class="token key atrule">Global</span><span class="token punctuation">:</span> <span class="token important">&amp;ChannelCapabilities</span>
        <span class="token key atrule">V1_1</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
    <span class="token key atrule">Orderer</span><span class="token punctuation">:</span> <span class="token important">&amp;OrdererCapabilities</span>
        <span class="token key atrule">V1_1</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
    <span class="token key atrule">Application</span><span class="token punctuation">:</span> <span class="token important">&amp;ApplicationCapabilities</span>
        <span class="token key atrule">V1_2</span><span class="token punctuation">:</span> <span class="token boolean important">true</span>
        
<span class="token comment"># 组织节点相关配置信息</span>
<span class="token key atrule">Organizations</span><span class="token punctuation">:</span>
	<span class="token comment"># orderer节点配置信息</span>
    <span class="token punctuation">-</span> <span class="token important">&amp;OrdererOrg</span>
        <span class="token key atrule">Name</span><span class="token punctuation">:</span> OrdererOrg	<span class="token comment"># orderer节点名称</span>
        <span class="token key atrule">ID</span><span class="token punctuation">:</span> OrdererMSP		<span class="token comment"># orderer节点编号</span>
        <span class="token key atrule">MSPDir</span><span class="token punctuation">:</span> ./crypto<span class="token punctuation">-</span>config/ordererOrganizations/itcast.com/msp	<span class="token comment"># msp文件路径</span>
	<span class="token comment">#orderer节点中包含的组织，如果有有多个需要配置多个</span>
    <span class="token punctuation">-</span> <span class="token important">&amp;OrgGo</span>
        <span class="token key atrule">Name</span><span class="token punctuation">:</span> OrgGoMSP		<span class="token comment"># 组织名称</span>
        <span class="token key atrule">ID</span><span class="token punctuation">:</span> OrgGoMSP		<span class="token comment"># 组织编号</span>
        <span class="token comment"># 组织msp文件路径</span>
        <span class="token key atrule">MSPDir</span><span class="token punctuation">:</span> ./crypto<span class="token punctuation">-</span>config/peerOrganizations/go.itcast.com/msp
        <span class="token key atrule">AnchorPeers</span><span class="token punctuation">:</span>		<span class="token comment"># 组织的访问域名和端口</span>
            <span class="token punctuation">-</span> <span class="token key atrule">Host</span><span class="token punctuation">:</span> peer0.go.itcast.com
              <span class="token key atrule">Port</span><span class="token punctuation">:</span> <span class="token number">7051</span>
    <span class="token punctuation">-</span> <span class="token important">&amp;OrgJava</span>
        <span class="token key atrule">Name</span><span class="token punctuation">:</span> OrgJavaMSP
        <span class="token key atrule">ID</span><span class="token punctuation">:</span> OrgJavaMSP
        <span class="token key atrule">MSPDir</span><span class="token punctuation">:</span> ./crypto<span class="token punctuation">-</span>config/peerOrganizations/java.itcast.com/msp
        <span class="token key atrule">AnchorPeers</span><span class="token punctuation">:</span>
            <span class="token punctuation">-</span> <span class="token key atrule">Host</span><span class="token punctuation">:</span> peer0.java.itcast.com
              <span class="token key atrule">Port</span><span class="token punctuation">:</span> <span class="token number">7051</span>
              
<span class="token comment"># orderer节点的配置信息</span>
<span class="token key atrule">Orderer</span><span class="token punctuation">:</span> <span class="token important">&amp;OrdererDefaults</span>
    <span class="token comment"># orderer节点共识算法，有效值：&quot;solo&quot; 和 &quot;kafka&quot;</span>
    <span class="token key atrule">OrdererType</span><span class="token punctuation">:</span> solo
    <span class="token key atrule">Addresses</span><span class="token punctuation">:</span>
        <span class="token punctuation">-</span> ubuntu.itcast.com<span class="token punctuation">:</span><span class="token number">7050</span>	<span class="token comment"># orderer节点监听的地址</span>
    <span class="token key atrule">BatchTimeout</span><span class="token punctuation">:</span> 2s
    <span class="token key atrule">BatchSize</span><span class="token punctuation">:</span>
        <span class="token key atrule">MaxMessageCount</span><span class="token punctuation">:</span> <span class="token number">10</span>
        <span class="token key atrule">AbsoluteMaxBytes</span><span class="token punctuation">:</span> 99 MB
        <span class="token key atrule">PreferredMaxBytes</span><span class="token punctuation">:</span> 512 KB
	<span class="token comment"># kafka相关配置</span>
    <span class="token key atrule">Kafka</span><span class="token punctuation">:</span>
        <span class="token key atrule">Brokers</span><span class="token punctuation">:</span>
            <span class="token punctuation">-</span> 127.0.0.1<span class="token punctuation">:</span><span class="token number">9092</span>
    <span class="token key atrule">Organizations</span><span class="token punctuation">:</span>
    
<span class="token key atrule">Application</span><span class="token punctuation">:</span> <span class="token important">&amp;ApplicationDefaults</span>
    <span class="token key atrule">Organizations</span><span class="token punctuation">:</span>
</code></pre></div><blockquote><p>上述配置文件中的 Profiles节点定义了整个系统的结构和channel的结构, 配置文件中的<code>Profiles</code>关键字不允许修改，否则配置无效。系统配置信息中设置了系统中orderer节点的信息以及系统中包含的组织数。</p></blockquote> <h4 id="configtxgen-的使用"><a href="#configtxgen-的使用" class="header-anchor">#</a> configtxgen 的使用</h4> <blockquote><p>为了统一管理，我们可以将生成的初始块文件放入指定目录中，如：channel-artifacts，我们在TestNetWork目录中创建该子目录。</p> <p><font color="red">configtxgen  命令在执行的时候需要加载一个叫做configtx.yaml的配置文件, 如果没有指定默认重命令执行的当前目录查找，我们可以通过参数 <code>-configPath</code>进行指定，也可以将这个目录设置到环境变量<code>FABRIC_CFG_PATH</code>中。</font></p> <p><code>export FABRIC_CFG_PATH=$(pwd)/networks/config/</code></p></blockquote> <ul><li><p>创建 <code>orderer</code> 的初始块</p> <div class="language-shell extra-class"><pre class="language-shell"><code>itcast@ubuntu:TestNetWork$ configtxgen -profile ItcastOrgOrdererGenesis -outputBlock ./channel-artifacts/genesis.block
<span class="token comment"># ItcastOrgOrdererGenesis: 要和配置文件中的配置项对应, 可以由数字和字母构成.</span>
<span class="token comment"># orderer初始块文件为genesis.block，生成在channel-artifacts目录中</span>
</code></pre></div></li> <li><p>创建 <code>channel</code> 的初始块</p> <div class="language-shell extra-class"><pre class="language-shell"><code>itcast@ubuntu:TestNetWork$ configtxgen -profile TwoOrgsChannel -outputCreateChannelTx ./channel-artifacts/channel.tx -channelID mychannel
<span class="token comment"># TwoOrgsChannel: 要和配置文件中的配置项对应</span>
<span class="token comment"># channel.tx 为生成的频道文件, 在channel-artifacts目录中</span>
<span class="token comment"># 创建的频道名称为: mychannel</span>
</code></pre></div></li> <li><p>创建锚点更新文件 - 每个组织分别进行更新</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 更新第一个组织 OrgGoMSP 的peer节点</span>
itcast@ubuntu:TestNetWork$ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/GoMSPanchors.tx -channelID mychannel -asOrg OrgGoMSP
<span class="token comment"># TwoOrgsChannel: 要和配置文件中的配置项对应</span>
<span class="token comment"># OrgGoMSP组织使用的频道为 mychannel 生成的配置信息文件名为 GoMSPanchors.tx</span>
<span class="token comment">#==============================================================================</span>
<span class="token comment"># 更新第2个组织 OrgJavaMSP 的peer节点</span>
itcast@ubuntu:TestNetWork$ configtxgen -profile TwoOrgsChannel -outputAnchorPeersUpdate ./channel-artifacts/JavaMSPanchors.tx -channelID mychannel -asOrg OrgJavaMSP
<span class="token comment"># TwoOrgsChannel: 要和配置文件中的配置项对应</span>
<span class="token comment"># OrgJavaMSP组织使用的频道为 mychannel 生成的配置信息文件名为 JavaMSPanchors.tx</span>
</code></pre></div></li></ul> <h3 id="_3-3-orderer"><a href="#_3-3-orderer" class="header-anchor">#</a> 3.3 orderer</h3> <blockquote><p>orderer 模块负责对交易进行排序, 并将排序好的交易打包成区块。orderer节点的配置信息通常放在环境变量或者配置文件中，在具体操作中，如果是通过docker镜像文件的方式启动orderer，推荐使用环境变量的方式，如果是采用命令的方式直接启动，推荐将所有的信息放到配置文件中。下面将会详细介绍其用到的环境变量。</p> <p>orader配置文件可参考实例程序中的<code>orderer.yaml</code></p> <p><code>~/hyperledger-fabric/fabric-samples/config/orderer.yaml</code></p></blockquote> <h4 id="orderer模块命令"><a href="#orderer模块命令" class="header-anchor">#</a> orderer模块命令</h4> <div class="language-shell extra-class"><pre class="language-shell"><code>$ orderer --help
usage: orderer <span class="token punctuation">[</span><span class="token operator">&lt;</span>flags<span class="token operator">&gt;</span><span class="token punctuation">]</span> <span class="token operator">&lt;</span>command<span class="token operator">&gt;</span> <span class="token punctuation">[</span><span class="token operator">&lt;</span>args<span class="token operator">&gt;</span> <span class="token punctuation">..</span>.<span class="token punctuation">]</span>
Hyperledger Fabric orderer node
Flags:
  --help  Show context-sensitive <span class="token builtin class-name">help</span> <span class="token punctuation">(</span>also try --help-long and --help-man<span class="token punctuation">)</span>.

Commands:
  <span class="token comment"># 显示帮助信息</span>
  <span class="token variable"><span class="token variable">`</span><span class="token builtin class-name">help</span> <span class="token punctuation">[</span><span class="token operator">&lt;</span>command<span class="token operator">&gt;</span><span class="token punctuation">..</span>.<span class="token punctuation">]</span>
     Show help.
  <span class="token comment"># 启动orderer节点</span>
  <span class="token variable">`</span></span>start*
     Start the orderer node
  <span class="token comment"># 显示版本信息</span>
  <span class="token variable"><span class="token variable">`</span>version
     Show version information
  <span class="token comment"># 采用基准模式运行orderer</span>
  <span class="token variable">`</span></span>benchmark
     Run orderer <span class="token keyword">in</span> benchmark mode
</code></pre></div><h4 id="orderer模块的配置信息"><a href="#orderer模块的配置信息" class="header-anchor">#</a> orderer模块的配置信息</h4> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># orderer节点运行需要配置一些环境变量</span>
ORDERER_GENERAL_LOGLEVEL	<span class="token comment"># 日志级别</span>
	- <span class="token variable"><span class="token variable">`</span>critical <span class="token operator">|</span> error <span class="token operator">|</span> warning <span class="token operator">|</span> notice <span class="token operator">|</span> info <span class="token operator">|</span> debug
ORDERER_GENERAL_LISTENADDRESS	<span class="token comment"># orderer服务器监听的地址</span>
ORDERER_GENERAL_LISTENPORT		<span class="token comment"># orderer服务器监听的端口</span>
ORDERER_GENERAL_GENESTSMETHOD	<span class="token comment"># 初始化块(Genesis)的来源方式, 一般赋值为 file 即可</span>
ORDERER_GENERAL_GENESISFILE		<span class="token comment"># 存储初始块文件的路径</span>
ORDERER_GENERAL_LOCALMSPID		<span class="token comment"># orderer节点的编号,在configtxgen模块配置文件中指定的</span>
	- <span class="token variable">`</span></span>configtx.yaml配置文件中排序节点的组织的ID
ORDERER_GENERAL_LOCALMSPDIR		<span class="token comment"># orderer节点msp文件路径</span>
ORDERER_GENERAL_LEDGERTYPE		<span class="token comment"># 账本类型, ram, json, file</span>
	- <span class="token variable"><span class="token variable">`</span>ram: 账本数据存储在内存, 一般用于测试环境
	- <span class="token variable">`</span></span>json/file: 账本数据保存在文件中, 生成环境中推荐使用file 
ORDERER_GENERAL_BATCHTIMEOUT	<span class="token comment"># 批处理超时, 创建批处理之前的等待时间</span>
	- <span class="token variable"><span class="token variable">`</span>每隔一个BATCHTIMEOUT时长, 就会生成一个新的区块
ORDERER_GENERAL_MAXMESSAGECOUNT	<span class="token comment"># 最大消息计数, 批处理的最大消息数量</span>
	- <span class="token variable">`</span></span>只要一个区块的消息达到MAXMESSAGECOUNT指定的数量, 就会生成一个新的区块
ORDERER_GENERAL_TLS_ENABLED		<span class="token comment"># 是否启用TLS, true/false</span>
ORDERER_GENERAL_TLS_PRIVATEKEY	<span class="token comment"># orderer节点的私钥文件, 按照下边的示例目录找</span>
	- <span class="token variable"><span class="token variable">`</span>crypto-config/ordererOrganizations/xx.com/orderers/orderer.xx.com/tls/server.key
ORDERER_GENERAL_TLS_CERTIFICATE	<span class="token comment"># 证书文件</span>
	- <span class="token variable">`</span></span>crypto-config/ordererOrganizations/xx.com/orderers/orderer.xx.com/tls/server.crt
ORDERER—GENERAL_TLS_ROOTCAS		<span class="token comment"># 根证书文件</span>
	- `crypto-config/ordererOrganizations/xx.com/orderers/orderer.xx.com/tls/ca.crt
</code></pre></div><h3 id="_3-4-peer"><a href="#_3-4-peer" class="header-anchor">#</a> 3.4 peer</h3> <blockquote><p>peer模块是Fabric中最重要的模块，也是在Fabric系统使用最多的模块。peer模块在Fabric中被称为主节点模块，主要负责存储区块链数据、运行维护链码、提供对外服务接口等作用。</p></blockquote> <h4 id="命令行和常用参数"><a href="#命令行和常用参数" class="header-anchor">#</a> 命令行和常用参数</h4> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 通过docker启动peer节点的镜像文件, 可查看相关操作命令</span>
$ docker run -it hyperledger/fabric-peer <span class="token function">bash</span>
$ peer --help
Usage:
  peer <span class="token punctuation">[</span>command<span class="token punctuation">]</span>

Available Commands:
  <span class="token variable"><span class="token variable">`</span>chaincode<span class="token variable">`</span></span>   相关的子命令:
  		<span class="token variable"><span class="token variable">`</span><span class="token function">install</span><span class="token variable">`</span></span>
  		<span class="token variable"><span class="token variable">`</span>instantiate<span class="token variable">`</span></span>
  		<span class="token variable"><span class="token variable">`</span>invoke<span class="token variable">`</span></span>
  		<span class="token variable"><span class="token variable">`</span>package<span class="token variable">`</span></span>
  		<span class="token variable"><span class="token variable">`</span>query<span class="token variable">`</span></span>
  		<span class="token variable"><span class="token variable">`</span>signpackage<span class="token variable">`</span></span>
  		<span class="token variable"><span class="token variable">`</span>upgrade<span class="token variable">`</span></span>
  		<span class="token variable"><span class="token variable">`</span>list<span class="token variable">`</span></span>
  channel     通道操作: create<span class="token operator">|</span>fetch<span class="token operator">|</span><span class="token function">join</span><span class="token operator">|</span>list<span class="token operator">|</span>update<span class="token operator">|</span>signconfigtx<span class="token operator">|</span>getinfo.
  <span class="token builtin class-name">help</span>        查看相关命令的帮助信息
  logging     日志级别: getlevel<span class="token operator">|</span>setlevel<span class="token operator">|</span>revertlevels.
  node        node节点操作: start<span class="token operator">|</span>status.
  version     当前peer的版本.

Flags:
  -h, --help                   <span class="token builtin class-name">help</span> <span class="token keyword">for</span> peer
      --logging-level string   Default logging level and overrides, see core.yaml <span class="token keyword">for</span> full syntax
</code></pre></div><h4 id="peer-channel子命令"><a href="#peer-channel子命令" class="header-anchor">#</a> peer channel子命令</h4> <blockquote><p>peer channel的子命令可以通过 <code>peer channel --help</code>进行查看. 这里介绍一个这些子命令可以共用的一些参数:</p> <ul><li><p><code>--cafile</code>:  当前orderer节点pem格式的tls证书文件, <font color="red">要使用绝对路径</font>.</p> <p><code>crypto-config/ordererOrganizations/itcast.com/orderers/ubuntu.itcast.com/msp/tlscacerts/tlsca.itcast.com-cert.pem</code></p></li> <li><p><code>-o, --orderer</code>: orderer节点的地址</p></li> <li><p><code>--tls</code>: 通信时是否使用tls加密</p></li></ul></blockquote> <ul><li><p><strong>create</strong> - 创建通道</p> <blockquote><p>命令: <code>peer channel create [flags]</code>, 可用参数为:</p> <ul><li><code>-c, --channelID</code>: 要创建的通道的ID, 必须小写, 在250个字符以内</li> <li><code>-f, --file</code>: 由configtxgen 生成的通道文件, 用于提交给orderer</li> <li><code>-t, --timeout</code>: 创建通道的超时时长</li></ul></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code>$ peer channel create -o orderer.itcast.com:7050 -c itcastchannel -f ./channel-artifacts/channel.tx --tls <span class="token boolean">true</span> --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/itcast.com/msp/tlscacerts/tlsca.itcast.com-cert.pem
</code></pre></div></li> <li><p><strong>join</strong> - 将peer加入到通道中</p> <blockquote><p>命令: <code>peer channel join[flags]</code>, 可用参数为:</p> <ul><li><code>-b, --blockpath</code>: 通道文件</li></ul></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code>$ peer channel <span class="token function">join</span> -b itcastchannel.block
</code></pre></div></li> <li><p><strong>list</strong> - 列出peer加入的通道</p> <div class="language-shell extra-class"><pre class="language-shell"><code>$ peer channel list
</code></pre></div></li> <li><p><strong>update</strong> - 更新</p> <blockquote><p>命令: <code>peer channel update [flags]</code>, 可用参数为:</p> <ul><li><code>-c, --channelID</code>: 要创建的通道的ID, 必须小写, 在250个字符以内</li> <li><code>-f, --file</code>: 由configtxgen 生成的组织锚节点文件, 用于提交给orderer</li></ul></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code>$ peer channel update -o orderer.example.com:7050 -c itcastchannel -f ./channel-artifacts/Org1MSPanchors.tx --tls <span class="token boolean">true</span> --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem
</code></pre></div></li></ul> <h4 id="peer-chaincode-子命令"><a href="#peer-chaincode-子命令" class="header-anchor">#</a> peer chaincode 子命令</h4> <blockquote><p><code>chaincode</code>一共有四个公共参数选项, 这些选项所有的子命令都可以使用, 他们分别是:</p> <ul><li><code>--cafile</code>: PEM格式证书的位置</li> <li><code>-o, --orderer</code>: orderer服务器的访问地址</li> <li><code>--tls</code>: 使用orderer的TLS证书位置</li> <li><code>--transient</code>: JSON参数的编码映射</li></ul> <p>chaincode命令的运行需要一些参数，这些参数可以是配置文件也可以是环境变量，由于涉及的参数并不是很多，因此大多数时候都会采用环境变量的方式来设置参数。</p></blockquote> <ul><li><p><strong>install</strong></p> <blockquote><p>install命令负责安装chaincode，在这个过程中如果chaincode的源代码存在语法错误，install命令会报错。install命令的选项如下所示：</p> <ul><li><code>-c, --ctor</code>: JSON格式的构造参数, 默认是<code>&quot;{}&quot;</code></li> <li><code>-l, --lang</code>: 编写chaincode的编程语言, 默认值是 <code>golang</code></li> <li><code>-n, --name</code>: chaincode的名字</li> <li><code>-p, --path</code>: chaincode源代码的名字</li> <li><code>-v, --version</code>: 当前操作的chaincode的版本, 适用这些命令<code>install/instantiate/upgrade</code></li></ul></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code>$ peer chaincode <span class="token function">install</span> -n mycc -v <span class="token number">1.0</span> -l golang -p github.com/chaincode/chaincode_example02/go/
<span class="token comment"># 安装成功之后, 会在peer模块的数据文件中生成一个由 -n 参数和 -v 参数组成的文件,在本例中为:</span>
$ docker-compose -f docker-compose-cli.yaml images
      Container                  Repository            Tag      Image Id      Size  
------------------------------------------------------------------------------------
cli                      hyperledger/fabric-tools     <span class="token number">1.2</span>.0   <span class="token number">379602873003</span>   <span class="token number">1.41</span> GB
orderer.example.com      hyperledger/fabric-orderer   <span class="token number">1.2</span>.0   4baf7789a8ec   <span class="token number">145</span> MB 
peer0.org1.example.com   hyperledger/fabric-peer      <span class="token number">1.2</span>.0   82c262e65984   <span class="token number">151</span> MB 
peer0.org2.example.com   hyperledger/fabric-peer      <span class="token number">1.2</span>.0   82c262e65984   <span class="token number">151</span> MB 
peer1.org1.example.com   hyperledger/fabric-peer      <span class="token number">1.2</span>.0   82c262e65984   <span class="token number">151</span> MB 
peer1.org2.example.com   hyperledger/fabric-peer      <span class="token number">1.2</span>.0   82c262e65984   <span class="token number">151</span> MB 
itcast@ubuntu:first-network$ docker <span class="token builtin class-name">exec</span> -it peer0.org1.example.com <span class="token function">bash</span>
root@661a44ad6677:/opt/gopath/src/github.com/hyperledger/fabric/peer<span class="token comment"># find / -name mycc.1.0</span>
/var/hyperledger/production/chaincodes/mycc.1.0	<span class="token comment"># 查询到的结果 - mycc.1.0</span>
<span class="token comment"># 通过find命令搜索到的 mycc.1.0 文件就是chaincode打包之后的文件</span>
</code></pre></div></li> <li><p><strong>instantiate</strong></p> <blockquote><p>instantiate可以对已经执行过instanll命令的Chaincode进行实例化，instantiate命令执行完成之后会启动Chaincode运行的Docker镜像，同时instantiate命令还会对Chaincode进行初始化。instantiate命令的选项如下所示：</p> <ul><li><code>-C，--channelID</code>：当前命令运行的通道，默认值是<code>“testchainid&quot;</code>。</li> <li><code>-c, --ctor</code>：JSON格式的构造参数，默认值是<code>“{}&quot;</code></li> <li><code>-E ， --escc</code> ： 应用于当前Chaincode的系统背书Chaincode的名字。</li> <li><code>-l，--lang</code>：编写Chaincode的编程语言，默认值是golang</li> <li><code>-n，--name</code>：Chaincode的名字。</li> <li><code>-P，--policy</code>：当前Chaincode的背书策略。</li> <li><code>-v，--version</code>：当前操作的Chaincode的版本，适用于<code>install/instantiate/upgrade</code>等命令</li> <li><code>-V，--vscc</code>：当前Chaincode调用的验证系统Chaincode的名字。</li></ul></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code>$ peer chaincode instantiate -o orderer.example.com:7050 --tls <span class="token boolean">true</span> --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/example.com/orderers/orderer.example.com/msp/tlscacerts/tlsca.example.com-cert.pem -C itcastchannel -n mycc -l golang -v <span class="token number">1.0</span> -c <span class="token string">'{&quot;Args&quot;:[&quot;init&quot;,&quot;a&quot;,&quot;100&quot;,&quot;b&quot;,&quot;200&quot;]}'</span> -P <span class="token string">&quot;AND ('Org1MSP.member', 'Org2MSP.member')&quot;</span>
<span class="token comment"># instantiate命令成功执行之后，可以通过docker ps命令查看己经启动的运行Chaincode的docker容器。</span>
</code></pre></div></li> <li><p><strong>invoke</strong></p> <blockquote><p>invoke命令用来调用chaincode。invoke命令的选项如下所示：</p> <ul><li><code>-C，--channelID</code>：当前命令运行的通道，默认值是<code>“testchainid&quot;</code></li> <li><code>-c, --ctor</code>：JSON格式的构造参数，默认值是<code>“{}&quot;</code></li> <li><code>-n，--name</code>：Chaincode的名字。</li></ul></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 调用示例</span>
$ peer chaincode invoke -o orderer.test.com:7050  -C testchannel -n testcc --tls <span class="token boolean">true</span> --cafile /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/ordererOrganizations/test.com/orderers/orderer.test.com/msp/tlscacerts/tlsca.test.com-cert.pem --peerAddresses peer0.orgGo.test.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgGo.test.com/peers/peer0.orgGo.test.com/tls/ca.crt --peerAddresses peer0.orgcpp.test.com:7051 --tlsRootCertFiles /opt/gopath/src/github.com/hyperledger/fabric/peer/crypto/peerOrganizations/orgcpp.test.com/peers/peer0.orgcpp.test.com/tls/ca.crt -c <span class="token string">'{&quot;Args&quot;:[&quot;invoke&quot;,&quot;a&quot;,&quot;b&quot;,&quot;10&quot;]}'</span>
</code></pre></div></li> <li><p><strong>list</strong></p> <blockquote><p>list命令用来查询已经安装的Chaincode，list命令的选项如下所示：</p> <ul><li><code>-C，--channelID</code>：当前命令运行的通道，默认值是<code>“testchainid&quot;</code></li> <li><code>--installed</code>：获取当前Peer节点已经被安装的chaincode</li> <li><code>--instantiated</code>：获取当前channel中已经被实例化的chaincode</li></ul></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 调用示例</span>
$ peer chaincode list --installed
</code></pre></div></li> <li><p><strong>package</strong></p> <blockquote><p>package用来将Chaincode打包。package命令的选项如下所示：</p> <ul><li><code>-s，--cc-package</code>：对打包后的Chaincode进行签名。</li> <li><code>-c, --ctor</code>：JSON格式的构造参数，默认值是<code>“{}&quot;</code></li> <li><code>-i，--instantiate-policy</code>：Chaincode的权限</li> <li><code>-l，--lang</code>：编写Chaincode的编程语言，默认值是golang</li> <li><code>-n，--name</code>：Chaincode的名字。</li> <li><code>-p，--path</code>：Chaincode源代码的路径。</li> <li><code>-S，--sign</code>：对打包的文件用本地的MSP进行签名。</li> <li><code>-v，--version</code>：当前操作的Chaincode的版本，适用于<code>install/instantiate/upgrade</code>等命令</li></ul></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 调用示例</span>
$ peer chaincode package — github.com/hyperledger/fabric/examples/chaincode/go/example  —n mycc —v <span class="token number">1.0</span> -s —S -i <span class="token string">&quot;OR ('Org1MSP.member'，'Org2MSP.member')&quot;</span> mycc.1.0.out 
</code></pre></div></li> <li><p><strong>query</strong></p> <blockquote><p>query命令用来执行chaincode代码中的query方法。query命令的选项如下：</p> <ul><li><code>-C，--channelID</code>：当前命令运行的通道，默认值是<code>“testchainid&quot;</code></li> <li><code>-c, --ctor</code>：JSON格式的构造参数，默认值是<code>“{}&quot;</code></li> <li><code>-x，--hex</code>：是否对输出的内容进行编码处理</li> <li><code>-n，--name</code>：Chaincode的名字。</li> <li><code>-r，--raw</code>：是否输出二进制内容</li> <li><code>-t, --tid</code>: 指定当前查询的编号</li></ul></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 调用示例</span>
$ peer chaincode query -C testchannel -n testcc -c <span class="token string">'{&quot;Args&quot;:[&quot;query&quot;,&quot;a&quot;]}'</span>
</code></pre></div></li> <li><p><strong>upgrade</strong></p> <blockquote><p>upgrade用来更新已经存在的chaincode。命令选项如下：</p> <ul><li><code>-C，--channelID</code>：当前命令运行的通道，默认值是<code>“testchainid&quot;</code></li> <li><code>-c, --ctor</code>：JSON格式的构造参数，默认值是<code>“{}&quot;</code></li> <li><code>-E ， --escc</code> ： 应用于当前Chaincode的系统背书Chaincode的名字。</li> <li><code>-l，--lang</code>：编写Chaincode的编程语言，默认值是golang</li> <li><code>-n，--name</code>：Chaincode的名字。</li> <li><code>-p, --path</code>: chaincode源代码的名字</li> <li><code>-P，--policy</code>：当前Chaincode的背书策略。</li> <li><code>-v，--version</code>：当前操作的Chaincode的版本，适用于<code>install/instantiate/upgrade</code>等命令</li> <li><code>-V，--vscc</code>：当前Chaincode调用的验证系统Chaincode的名字。</li></ul></blockquote> <div class="language-shell extra-class"><pre class="language-shell"><code>$ peer chaincode upgrade -o orderer.example.com:7050 -n mycc -v <span class="token number">1.1</span> -C mychannel -c <span class="token string">'{&quot;Args&quot;:[&quot;init&quot;,&quot;a&quot;,&quot;100&quot;,&quot;b&quot;,&quot;200&quot;]}'</span>
</code></pre></div></li></ul> <h4 id="peer-的环境变量"><a href="#peer-的环境变量" class="header-anchor">#</a> <strong>peer 的环境变量</strong></h4> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token comment"># 配置文件和环境变量是设置peer启动参数的重要手段, 相关环境变量如下:</span>
CORE_VM_ENDPOINT	<span class="token comment"># docker服务器的Deamon地址, 默认取端口的套接字, 如下:</span>
	- <span class="token variable"><span class="token variable">`</span>unix:///var/run/docker.sock
CORE_VM_DOCKER_HOSTCONFIG_NETWORKMODE	<span class="token comment"># chaincode容器的网络命名模式, 自己取名即可</span>
	- <span class="token variable">`</span></span>节点运行在同一个网络中才能相互通信, 不同网络中的节点相互隔离
CORE_PEER_PROFILE_ENABLED	<span class="token comment"># 使用peer内置的 profile server</span>
	- <span class="token variable"><span class="token variable">`</span>fabric的peer内置有profile server，默认时运行在6060端口上的，并且默认关闭。
CORE_LOGGING_LEVEL		<span class="token comment"># log日志的级别</span>
	- <span class="token variable">`</span></span>critical <span class="token operator">|</span> error <span class="token operator">|</span> warning <span class="token operator">|</span> notice <span class="token operator">|</span> info <span class="token operator">|</span> debug
CORE_PEER_ID	<span class="token comment"># peer节点的编号, 自定义一个即可</span>
CORE_PEER_GOSSIP_USELEADERELECTION	<span class="token comment"># 是否自动选举leader节点, 自动:true</span>
CORE_PEER_GOSSIP_ORGLEADER			<span class="token comment"># 当前节点是否为leader节点, 是:true</span>
CORE_PEER_ADDRESS					<span class="token comment"># 当前peer节点的访问地址</span>
	- <span class="token variable"><span class="token variable">`</span>格式: 域名:端口 / IP:端口
CORE_PEER_CHAINCODELISTENADDRESS	<span class="token comment"># chaincode的监听地址</span>
CORE_PEER_GOSSIP_EXTERNALENDPOINT	<span class="token comment"># 节点被组织外节点感知时的地址</span>
	- <span class="token variable">`</span></span>默认为空, 代表不被其他组织节点所感知
CORE_PEER_GOSSIP_BOOTSTRAP	<span class="token comment"># 启动节点后向哪些节点发起gossip连接, 以加入网络</span>
	- <span class="token variable"><span class="token variable">`</span>这些节点与本地节点需要属于同一个网络
CORE_PEER_LOCALMSPID 	<span class="token comment"># peer节点所属的组织的编号, 在configtxgen.yaml中设置的</span>
CORE_CHAINCODE_MODE		<span class="token comment"># chaincode的运行模式</span>
	- <span class="token variable">`</span></span>net: 网络模式
	- <span class="token variable"><span class="token variable">`</span>dev: 开发模式, 该模式下可以在容器外运行chaincode
CORE_PEER_MSPCONFIGPATH	<span class="token comment"># 当前节点的msp文件路径</span>
	- <span class="token variable">`</span></span>启动peer的时候需要使用msp账号文件
	- <span class="token variable"><span class="token variable">`</span>crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/msp
	- <span class="token variable">`</span></span>创建channel的时候需要使用msp账号文件
	- <span class="token variable"><span class="token variable">`</span>crypto-config/peerOrganizations/org1.x.com/users/Admin@org1.x.com/msp
CORE_PEER_TLS_ENABLED	<span class="token comment"># 是否激活tls, 激活:true, 不激活:false</span>
CORE_PEER_TLS_CERT_FILE	<span class="token comment"># 服务器身份验证证书</span>
	- <span class="token variable">`</span></span>crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/server.crt
CORE_PEER_TLS_KEY_FILE	<span class="token comment"># 服务器的私钥文件</span>
	- <span class="token variable"><span class="token variable">`</span>crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/server.key
CORE_PEER_TLS_ROOTCERT_FILE	<span class="token comment"># 根服务器证书</span>
	- <span class="token variable">`</span></span>crypto-config/peerOrganizations/org1.x.com/peers/peer0.org1.x.com/tls/ca.crt
</code></pre></div><blockquote><p><font color="red">每个 org 会选举出一个 <strong>leader peer</strong>（实际上可以存在多个），负责连接到 orderer。<strong>leader peer</strong>从orderer 拿到新块的信息后分发给其他 peer。</font></p> <ul><li><p>静态选择leader peer</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_GOSSIP_USELEADERELECTION</span><span class="token operator">=</span>false
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_GOSSIP_ORGLEADER</span><span class="token operator">=</span>true <span class="token comment">#指定某一个peer为leader peer</span>
<span class="token comment"># 1. 如果都配置为 false，那么 peer 不会尝试变成一个 leader</span>
<span class="token comment"># 2. 如果都配置为 true，会引发异常</span>
<span class="token comment"># 3. 静态配置的方式，需要自行保证 leader 的可用性</span>
</code></pre></div></li> <li><p>动态选择leader peer</p> <div class="language-shell extra-class"><pre class="language-shell"><code><span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_GOSSIP_USELEADERELECTION</span><span class="token operator">=</span>true
<span class="token builtin class-name">export</span> <span class="token assign-left variable">CORE_PEER_GOSSIP_ORGLEADER</span><span class="token operator">=</span>false
</code></pre></div></li></ul></blockquote> <h4 id="peer-默认监听的端口"><a href="#peer-默认监听的端口" class="header-anchor">#</a> <strong>peer 默认监听的端口</strong></h4> <blockquote><p>下面是Hyperledger中相关监听的服务端口（默认）</p> <ul><li>7050: REST 服务端口</li> <li>7051：peer gRPC 服务监听端口</li> <li>7052：peer 代码调试模式使用的端口</li> <li>7053：peer 事件服务端口</li> <li>7054：eCAP</li> <li>7055：eCAA</li> <li>7056：tCAP</li> <li>7057：tCAA</li> <li>7058：tlsCAP</li> <li>7059：tlsCAA</li></ul></blockquote></div> <footer class="page-edit"><!----> <div class="last-updated"><span class="prefix">上次更新:</span> <span class="time">1/28/2021, 12:15:56 PM</span></div></footer> <!----> </main></div><div class="global-ui"></div></div>
    <script src="/assets/js/app.cb35c8f6.js" defer></script><script src="/assets/js/2.063846a6.js" defer></script><script src="/assets/js/4.1ffb4609.js" defer></script><script src="/assets/js/65.2beeae9b.js" defer></script>
  </body>
</html>
